عندما نقوم بتطوير التطبيقات بناءً على الربيع ، فإننا نضع عادة تكوين قاعدة البيانات في ملف الخصائص.
ملخص نقاط المعرفة المشاركة في تحليل الكود:
1.NamespaceHandler يمتلك مساحة الاسم المخصصة في ملف تكوين XML
2.ContextNamesPaceHandler Parser ذات الصلة بالسياق ، هنا يحدد المحلل المحدد لتحليل صاحب مكان property property
3. BeAndefinitionParser يوسع واجهة تعريف الفول
4.BeanFactoryPostProcessor بعد تحميل تعريف الفول ، يمكن تعديله.
5.propertysourcesplaceholderconfigurer يتولى العناصر النائبة في تعريف الفول
دعونا نلقي نظرة على الاستخدام المحدد أولاً
استخدام الممتلكات
تكوين ملف الخصائص في ملف XML
<؟ Xmlns: Context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd <سياق: property-placeholder location = "classpath: foo.properties" /> < /beans>
وبهذه الطريقة ، سيتم تحميل ملف /src/main/resources/foo.properties بحلول الربيع
إذا كنت ترغب في استخدام ملفات تكوين متعددة ، يمكنك إضافة حقل الطلب إلى الفرز
استخدم PropertySource لشرح التكوين
أضاف Spring 3.1 شرح @propertysource لتسهيل إضافة ملفات الممتلكات إلى البيئة.
@configuration @propertySource ("classpath: foo.properties") public class propertieswithjavaconfig {bean public static staticsourcesplaceholderconfigurer propertySourcesholderConfigurer () {return new propertysourcesholderConfigurer () ؛ }}حقن واستخدام الخصائص
1. استخدم @Value anotation للحصول على في Java
Value ("$ {jdbc.url}") سلسلة خاصة jdbcurl ؛يمكنك أيضًا إضافة قيمة افتراضية
value ("$ {jdbc.url: adefaulturl}") سلسلة خاصة jdbcurl ؛1. احصل عليه في ملف تكوين XML في الربيع
<bean id = "datasource"> <property name = "url" value = "$ {jdbc.url}" /> </bean>تحليل رمز المصدر
تحميل معلومات تكوين الخصائص
ستبدأ Spring العمل في تهيئة الحاوية من خلال AbstractApplicationContext#Refresh عند بدء التشغيل ، وخلال هذه الفترة ، سيتم تكليف LoadBeanDefinitions بتحليل ملف تكوين XML.
محمي النهائي void refreshbeanfactory () يلقي beansexception {if (hasbeanfactory ()) {destroybeans () ؛ CloseBeanFactory () ؛ } try {defaultListableBeanfactory beanfactory = createBeanFactory () ؛ beanfactory.SetSerializationId (getId ()) ؛ CustomBeanFactory (Beanfactory) ؛ loadBeanDefinitions (beanfactory) ؛ متزامن (this.beanfactorymonitor) {this.beanfactory = beanfactory ؛ }} catch (ioException ex) {رمي ApplicationContexTexception ("I/O خطأ في تحليل تعريف الفاصوليا" + getDisplayName () ، ex) ؛ }}loadbeandefinitions من خلال تفويض طبقة على أساس ، ابحث عن defaultbeandefinitiondocumentreader#parsebeandefinition لتحليل الفول المحدد
parsebeandefinitions parsebeandefinitions المحمية (جذر العنصر ، BeanDefinitionParserDelegate مندوب) {if (depate.isDefaultNamespace (root)) {nodelist nl = root.getchildnodes () ؛ لـ (int i = 0 ؛ i <nl.getLength () ؛ i ++) {node node = nl.item (i) ؛ if (node electionof element) {element ele = (element) node ؛ if (depate.isDefaultNamesPace (ele)) {parsedefaultElement (eLe ، depate) ؛ } آخر {depegate.parsecustomElement (eLe) ؛ }}}} آخر {devate.parsecustomElement (root) ؛ }} نظرًا لأن هذا ليس تعريفًا قياسيًا فئة ، فإنه يعهد بتقديم BeanDefinitionParserDelegate لتحليله
ابحث عن المعالج المقابل من خلال أسماء الاسم لإيجاد ContextNamesPaceHandler ، ثم العثور على PropertyPlaceholderBeanDefinitionparser تحليل محلل من خلال ID من خلال ID
Override public void init () {// هذا هو المحلل الذي نبحث عنه عن registerBeanDefinitionParser ("property-placeholder" ، new PropertyHolderBeanDefinitionParser ()) ؛ RegisterBeanDefinitionParser ("Property-Override" ، PropertyOverrideBeanDefinitionParser ()) ؛ registerBeanDefinitionParser ("التعليق التوضيحي-Config" ، التعليقات التوضيحية الجديدة ConfigBeanDefinitionParser ()) ؛ RegisterBeanDefinitionParser ("Component-Scan" ، مكونات جديدة canbeandefinitionparser ()) ؛ registerBeanDefinitionParser ("load-time-weaver" ، new LoadTimeWeaverBeanDefinitionParser ()) ؛ registerBeanDefinitionParser ("Spring-Configured" ، New SpringConfiguredBeanDefinitionParser ()) ؛ registerBeanDefinitionParser ("Mbean-Export" ، MbeanexportBeanDefinitionparser ()) ؛ registerBeanDefinitionParser ("Mbean-server" ، MBeanserverBeanDefinitionparser ()) ؛ } PropertyPlaceholderBeanDefinitionParser هو محور هذه الجولة من تحليل الكود.
دعونا نلقي نظرة على فئة الأم.
1. BeAndefinitionParser
تستخدم بواسطة DefaultBeanDefinitionDocumentReader لتحليل العلامات الشخصية
فقط API Parse يتم تعريف العنصر المتخصص هنا
الواجهة العامة beandefinitionparser {beandefinition parse (عنصر العنصر ، parsercontext parsercontext) ؛} 2.abstractbeandefinitionparser
التنفيذ التجريدي الافتراضي لواجهة BeanDefinitionParser. الربيع جيد في ذلك. يوفر العديد من واجهات برمجة التطبيقات المريحة هنا ، ويستخدم نمط تصميم طريقة القالب لتوفير خطافات تنفيذ مخصصة للفئات الفرعية.
دعنا نلقي نظرة على منطق المعالجة المحدد عند التحليل: استدعاء تحليل الخطاف الحاجز
3. الملخص
تحليل ، تحديد الفئة الوالد المجردة من تعريف واحد
في Parseinternal ، Parse Parentname ، Beanclass ، Source ؛ وتغلف باستخدام BeanDefinitionBuilder
4. AcctionPropertyloadingBeanDefinitionParser
تحليل الخصائص المتعلقة بالممتلكات ، مثل الموقع ، والخصائص-REF ، وترميز الملفات ، والطلب ، إلخ.
5.propertyplaceholderbeandefinitionparser
لا توجد أشياء كثيرة للتعامل معها هنا ، فقط تم إعداد inore-onresable و mode-properties
ملف خصائص التحميل ، مثيل للفول
بعد ذلك ، دعنا نلقي نظرة على ذلك عندما يتم إنشاء مثيل لهذه الفاصوليا. هناك نوعان من إنشاء فصول عامة. يتم إنشاء مثيل له عند بدء نظام Singleton ؛ يتم إنشاء مثيل للآخر عندما يتم إنشاء مثيل للونغليتون (أو التحميل الكسول المفرد) عند إنشاء مثيل له.
الزناد هنا هو من خلال BeanfcatoryPostProcessor.
BeanfactorypostProcessor يعدل تعريف الفول قبل إنشاء فول. على سبيل المثال ، يتم حل العناصر النائبة في تعريف الفول هنا ، ويتم حل الخصائص التي نستخدمها الآن هنا أيضًا.
يتم تنفيذ ذلك من خلال PostProcessorRigistrationDelegate#InvokebeanFactoryPostProcessors.
مسح BeanfactorypostProcessor في الحاوية ، والعثور على propertysourcesholderConfigurer اللازمة هنا ، وإنشاء إنشاء مثيل لها من خلال getBean الحاوية
proid invokebeanfactorypostprocessors (configurableListableBeanfactory Beanfactory) {postprocessorgistrationDelegate.invokebeanfactorypostprocessors (Beanfactory ، getBeanfactoryPostProcesss ()) ؛ }بعد اكتمال إنشاء PropertySourcesPlaceholderConfigurer ، سيتم تشغيله مباشرة وتحميل المعلومات.
OrderComparator.sort (phirstorderedPostProcessors) ؛ InvokeBeanfActoryPostProcessors (phirstorderDedPostProcessors ، Beanfactory) ؛
دعونا نلقي نظرة على نظام الميراث لـ PropertySourcesPlaceholderConfigurer
1.BeanFactoryPostProcessor
تحديد واجهة لتعديل خصائص تعريف الفول في حاوية. يتم إنشاء فئة التنفيذ الخاصة بها قبل استخدام الطبقات العامة ويتم تعديل خصائص الفئات الأخرى.
من الواضح أن هذا يختلف عن BeanpostProcessor ، الذي يعدل مثيلات الفول.
2.propertiesloadersupport
فئة مجردة تقوم بتحميل ملفات الخصائص.
منطق التحميل المحدد هنا هو توصيل PropertiesLoaderUtils#FillProperties للتنفيذ
3.PropertyResourCeConfigurer
يتم تنفيذ استبدال العناصر النائبة في تعريف الفول بواسطة هذه الفئة التجريدية.
تنفيذ BeanfactoryPostProcessor#postprocessbeanfactory ، وتكرار على تعريف الفصل في الحاوية ، وتعديله
كيفية تعديلها يتم تنفيذها عن طريق تسليمها إلى فئة فرعية من خلال Hook ProcessProperties
4. placeholderConfigurersupport
استخدم نمط تصميم الزوار لتحديث الخصائص من خلال BeanDefinitionVisitor و StringValueresolver
StringValueresolver هي واجهة تقوم بتحويل بيانات نوع السلسلة. تطبيق API الذي يقوم بتحديث الخصائص حقًا في الواقع
propertyplacehelderhelper#parsestringValue
5.PropertySourcesPlaceholderConfigurer
تجاوز عملية تحليل API بعد المعالج
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.