تلخص هذه المقالة بشكل أساسي بعض أساليب رد الاتصال والنقاط القابلة للتمديد التي توفرها حاوية Spring قبل وبعد تهيئة المثيل. باستخدام هذه الأساليب ونقاط التمديد ، يمكن إجراء بعض المعالجة المنطقية الخاصة قبل وبعد مثيلات التهيئة الربيع.
يتم تقديم ما يلي بشكل أساسي:
طريقة رد الاتصال على مدار دورة الحياة على مستوى الفئة ، تكوين طريقة ، واجهة التهيئة وتوضيح البناء بعد البناء
واجهة BeanPostProcessor على مستوى الحاويات وواجهة BeanFactoryPostProcessor
1. رد اتصال دورة الحياة على مستوى الفصل
1.1init-method
المرجع: springbeanxsdinit-method
INIT-METHOD هو عنصر تكوين عند الإعلان عن حبة في ملف تكوين الربيع. قيمة عنصر تكوين Method init هي طريقة بدون معلمة في الفصل ، ولكن يمكن إلقاء استثناء. سيتم استدعاء هذه الطريقة بعد أن تقوم حاوية الزنبرك بتثبيت الكائن وتعيين قيمة الخاصية.
تتوافق الوظائف التي يمكن تنفيذها بواسطة Method
ملفات تكوين الربيع وفئات الاختبار هي كما يلي:
<bean id = "initmethodbeanservice" init-method = "init"
فئة الاختبار كما يلي:
الطبقة العامة initmethodbeanservice {private static integer f1 ؛ integer private f2 ؛ static {f1 = 1 ؛ system.out.println ("initmethodbeanservice static كتلة ثابتة ...") init () {system.out.println ("initmethodbeanservice init method execute ...") ؛} integer public getf2 () {return f2 ؛} public void setf2 (integer f2) {this.f2 = f2 ؛تتم طباعة نتائج التنفيذ على النحو التالي:
initmethodbeanservice كتلة ثابتة تنفيذ ... initmethodbeanservice طريقة تنفيذ ... initmethodbeanservice method method method ... initmethodbeanservice init method execute ... test method execute ...
1.2InitializingBean واجهة
المرجع: الربيع الرسمي للوثيقة الفاصوليا-
تعلن واجهة التهيئة عن طريقة ما بعد propertiesset ، والتي تسمى بعد حاوية الزنبرك التي تقوم بتثبيت الكائن وتعيين قيمة الخاصية. يتوافق مع الوظيفة التي تم تنفيذها أعلاه ، لذلك لا يوصي SPRING باستخدام واجهة التهيئة.
المثال بسيط نسبيًا ، وليس مدرجًا
1.3PostConstruct التعليق التوضيحي
الترجمة: الربيع الرسمية الوثيقة الفاصوليا-البناء والربيع
BOSTCORNSTRUCT ENOTATION هي طريقة رد اتصال دورة الحياة تتوافق مع تنفيذ الواجهات init و initializingbean.
postconstructpublic void postconstruct () {system.out.println ("طريقة postconstructservice postconstruct تنفيذ ...") ؛}لخص أساليب رد الاتصال الثلاثة لدورة الحياة المذكورة أعلاه ، initializingbean واجهة ، @postconstruct التعليق التوضيحي
1. جميعها تم تأليفها ومرحلة ما بعد المعالجة لفصول واحدة
2. يتم استدعاء وقت التنفيذ بعد تثبيت الفصل ويتم حقن متغيرات الأعضاء.
3. بالنسبة إلى Method ، يمكنك أيضًا تكوين طريقة التهيئة الافتراضية ضمن عنصر الفاصوليا في ملف تكوين الربيع ، وعنصر التكوين هو مفترس الافتراض الافتراضي
4. إذا كانت طرق التهيئة التي تم تكوينها في الطرق الثلاثة المذكورة أعلاه مختلفة ، فإن ترتيب التنفيذ هو: طريقة التعليقات التوضيحية postconstruct> تهيئة طريقة ما بعد propertiesset> init ؛ إذا كانت الأساليب التي تم تكوينها في الطرق الثلاثة هي نفسها ، فسيتم تنفيذ الطريقة مرة واحدة فقط (راجع: الربيع الرسمي للوثيقة الفاصوليا-
5. هناك طريقة رد اتصال أولية ، وهناك أيضًا طريقة رد اتصال مدمرة. طريقة التعليقات التوضيحية postconstruct> تهيئة طرق youndpropertiesset> init
2. تمديد مستوى الحاوية
الترجمة: الوثيقة الرسمية الربيع 3.8-Containerextensionpoints
بشكل عام ، لا يحتاج المطورون إلى تخصيص فئة فرعية من ApplicationContext لتوسيع حاويات SpringIOC. يمكن أن تحقق حاويات springioc تمديد حاويات springioc من خلال بعض الواجهات المكشوفة.
2.1 BeAnpostProcessor واجهة
2.1.1Bean تهيئة مثيل ما بعد المعالج وسلسلة ما بعد المعالج
تحدد واجهة BeanPostProcessor طريقتي رد الاتصال على مستوى الحاويات بعد المعالجة ، وإضفاء الطابع بعد المعالجة ، والتي تستخدم لبعض المعالجة المنطقية بعد تهيئة المثيل وسيتم معالجتها لجميع الحالات في الحاوية. يسمى الفصل الذي ينفذ واجهة BeanPostProcessor معالج تهيئة مثيل Bean.
إذا تم دمج عمليات تهيئة مثيل متعددة في حاويات SpringIOC ، فإن مجموعة هذه المعالجات ما بعد المعالجة تسمى سلسلة ما بعد المعالج تهيئة مثيل Bean.
يتم تنفيذ طريقة postprocessbeforeinitialization بعد اكتمال تثبيت الطبقة والحقن المتغير الأعضاء ، وقبل طريقة التهيئة (مثل طريقة initializingbean بعد propertiesset)
يتم تنفيذ طريقة ما بعد المعالجة.
تلخيص:
1. تهيئة مثيل ما بعد المعالجة تستخدم في الغالب لبعض عمليات الوكيل على المثيل. يتم تنفيذ بعض الميزات التي تستخدم AOP في الربيع أيضًا من خلال مرحلة ما بعد المعالجات.
2. سلسلة ما بعد المعالجة هي تهيئة مثيل هي متعددة من المعالجات ، وستكون هناك مشاكل في أمر التنفيذ. يمكنك تنفيذ الواجهة المطلوبة لتحديد ترتيب تنفيذ ما بعد المعالجة. تعلن الواجهة المطلوبة عن طريقة Getorder. كلما كانت قيمة إرجاع الطريقة أصغر ، زادت أولوية ما بعد المعالجة والتنفيذ السابق.
3. عند تهيئة معالج ما بعد المعالج عن طريق تنفيذ واجهة BeanPostProcessor ، يوصى بتنفيذ الواجهة المطلوبة وتحديد الأولوية.
4. نطاق هؤلاء ما بعد المعالجة هو حاوية SpringiOC الحالية ، أي حاوية SpringiOC التي أعلنها المعالج. بالنسبة لحاويات SpringiOC ذات الهياكل الهرمية ، لا تعمل سلسلة المعالج بعد التهيئة على سبيل المثال على المثيل الذي تم تهيئته بواسطة حاويات أخرى ، حتى لو كانت الحاوين على نفس التسلسل الهرمي.
5. يجب إعلان فئة التنفيذ في تهيئة المثيل بعد المعالجة فقط مثل الفاصوليا العادية التي تديرها الربيع. ستقوم حاوية springioc باكتشافها تلقائيًا وإضافتها إلى سلسلة ما بعد المعالجة.
6. بالمقارنة مع الكشف التلقائي ، يمكننا أيضًا استدعاء طريقة AddBeanPostProcessor من قابلة للتكوين beanfactory لإضافة معالج تهيئة مثيل إلى سلسلة ما بعد المعالج. هذا أكثر عملية في السيناريوهات حيث يجب تحديد الظروف. يتجاهل نهج البرمجة هذا الترتيب المحدد من خلال الواجهة المطلوبة المنفذة ، ولكنه سيعمل على جميع الحالات التي يتم اكتشافها تلقائيًا قبل تهيئة ما بعد المعالج.
2.1.2 تهيئة مثيل الفول بعد المعالج و AOP
BeanPostProcessor هي واجهة خاصة ، وسيتم استخدام الفصل الذي ينفذ هذه الواجهة كبريد لما بعد المعالج لحالات الفاصوليا التي تديرها الربيع. لذلك ، في مرحلة خاصة من بدء تشغيل سياق تطبيق الربيع ، سيتم تهيئة جميع الحالات التي تنفذ واجهة BeanPostProcessor مباشرة ، وسيتم أيضًا إنشاء إنشاء فئات المشار إليها بواسطة المثيل. ثم بصفته مرحلة ما بعد المعالج للتقدم إلى الحالات العادية الأخرى.
نظرًا لأن الوكيل التلقائي لـ AOP يتم تنفيذه في شكل معالجات ما بعد التأسيس ، لا يهيئ مثيل Bean على مثيل سلسلة ما بعد المعالج أو يمكن تلقائيًا إلى مثيله المشار إليه. لذلك ، لا نسج في الوجه على هذه الأمثلة. (بالنسبة لهذه الحالات ، سيتم إنشاء رسالة سجل: "لا يمكن معالجة الفئة FOO بواسطة جميع سلاسل ما بعد المعالج التي تم تأليفها ، أي لا يمكن تلقائيًا بالوكالة").
ملاحظة: عندما يشير المعالج اللاحق لثلاثة خلاف إلى الفاصوليا الأخرى في شكل تلقائي أو resource ، يجوز لحاوية الزنبرك ضخ الفاصوليا غير المحددة عندما يتم حقنها مع تبعية مطابقة النوع (على سبيل المثال ، فإن فئة ما بعد المعالج على الحبة تعتمد على التقرير ، أو لا تقل عن الإخبار عن الإخبار ، فإنه لا يتم إقرار الفاصوليا. في شكل مطابقة النوع ، ويمكن حقن حبة غير محددة في هذا الوقت). يمكن أن يتسبب ذلك أيضًا في فشل الكلية التلقائية أو غيرها من طرق معالجة ما بعد المعالج.
2.1.3 مثال على مثيل الفول مثال ما بعد المعالج
الطبقة العامة beanpostprocsorservice تنفذ beanpostprocessor {Override كائن عام postprocessafterinitialization (كائن O ، السلسلة S) يلقي beansexception {system.out.println ("beanpostprocessorcervice postprocessialization method execute ...") ؛ Beansexception {system.out.println ("طريقة تنفيذ postprocessBeorforeforeInitialization beanpostprocservice.2.2 BEANFACTORYPOSTPROCESSER
2.2.1 Beanfactory postprocessor
من خلال تنفيذ واجهة BeanFactoryPostProcessor ، يمكنك قراءة بيانات تكوين الفاصوليا التي تديرها الحاوية وإجراء تغييرات قبل إنشاء الفول. وتسمى هذه الفاصوليا ما بعد المعالجات postpactory.
أوجه التشابه والاختلاف بين BeanfactoryPostProcessors واجهات BeanpostProcessor:
أوجه التشابه:
كلها هي ما بعد المعالجات على مستوى الحاويات
يمكن تكوين جميع مع العديد من المعالجات ، ويتم تحديد أمر التنفيذ عن طريق تطبيق الواجهة المطلوبة.
تتم معالجتها للفاصوليا المدارة في الحاويات التي أعلنتها الواجهات. في الحاويات ذات الهياكل الهرمية ، لا يمكن معالجة الفاصوليا في الحاويات الأخرى ، حتى لو كانت الحاثيان في نفس المستوى.
كلهم بحاجة فقط إلى الإعلان في الحاوية مثل الفاصوليا العادية. ستقوم الحاوية تلقائيًا باكتشاف وتسجيل كمرحلة ما بعد المعالج.
سيتم تجاهل تكوين خاصية تهيئة التأخير
الاختلافات:
تقوم واجهة BeanfactoryPostProcessors بمعالجة بيانات تكوين الفول قبل إنشاء مثيل للفاصوليا ، وواجهة BeanpostProcessor معالجة مثيل الفاصوليا بعد تثبيت الفاصوليا **
يمكن أن تحصل واجهة BeanFactoryPostProcessors أيضًا على مثيل من الفول من خلال طريقة beanfactory.getBean () ، مما سيؤدي إلى إنشاء إنشاء فول. نظرًا لأن BeanfactoryPostProcessors يتم تنفيذها قبل إنشاء جميع الفاصوليا ، فإن طريقة beanfactory.getBean () ستؤدي إلى إنشاء إنشاء فول مسبقًا ، مما قد يتجاهل معالجة دورة حياة الحاويات ، مما قد يسبب بعض الآثار السلبية (على سبيل المثال ، الفاصوليا المسبق مسبقًا.
2.2.2 الربيع المدمج والمخصص لما بعد المعالج
يحتوي Spring على معالجات ما بعد الفول المدمجة (على سبيل المثال: PropertyHolderConfigurer و PropertyOverrideConfigurer). كما يدعم تنفيذ واجهة BeanFactoryPostProcessor ويخصم معالج Beanfactory. دعنا نتحدث عن معالجات ما بعد المعالجات المدمجة في Spring وعلاج ما بعد المعالجة المخصصة.
propertyplaceholderConfigurer
من أجل تجنب المخاطر الناتجة عن تعديل ملف تعريف XML الرئيسي ، يوفر Spring فصل التكوين ، ويمكنه تكوين بعض المتغيرات التي يمكن تغييرها إلى ملف تكوين الخاصية والرجوع إليه في ملف تعريف XML كمكتب ضئيل. وبهذه الطريقة ، يتطلب تعديل التكوين فقط تعديل ملف تكوين السمة. يتم استخدام PropertyPlaceholderConfigurer للكشف عن العناصر النائبة واستبدال العناصر النائبة بقيم الممتلكات التكوين. الأمثلة على النحو التالي:
يستخدم PropertyHolderConfigurer ملف تكوين خاصية JDBC.Properties لاستبدال صاحب المركز العام للمعلومات المتعلقة بقاعدة البيانات في Bean DataSource بقيمة التكوين المقابلة في وقت التشغيل.
تكوين XML كما يلي:
<Bean> <property name = "sortes" value = "classpath: com/foo/jdbc.properties"/> </bean> <bean id = "dataSource" destroy-method = "close" name = "username" value = "$ {jdbc.username}"/> <property name = "password" value = "$ {jdbc.password}"/>ملف تكوين السمة jdbc.properties كما يلي:
jdbc.driverclassname = org.hsqldb.jdbcdriverjdbc.url = jdbc: hsqldb: hsql: // الإنتاج: 9002jdbc.username = sajdbc.password = root
PropertyPlaceholderConfigurer لا يدعم قراءة ملفات تكوين الخصائص فحسب ، بل يدعم أيضًا قراءة خصائص النظام. يمكن تكوين أولوية قراءة من خلال قيمة خاصية SystemPropertiesMode. تم وصف القيم المختلفة على النحو التالي:
0: لا تقرأ خصائص النظام
1: إذا لم يتم استرجاع التكوين الخاص بالمؤسس المقابل في ملف تكوين السمة المشار إليه ، فسيتم قراءة سمة النظام. الافتراضي هو 1
2: اقرأ سمات النظام أولاً ، ثم اقرأ ملف تكوين السمة المرجع. قد يتسبب هذا التكوين في تكوين خصائص النظام في كتابة ملف التكوين.
PropertyOverrideConfigurer
يمكن لفئة PropertyOverridEconFigurer تعيين قيم مباشرة إلى الفاصوليا في الحاوية من خلال الإشارة إلى ملف تكوين الخصائص. عندما يتم تعيين خاصية Bean بواسطة مثيلات فئة PropertyOverRideConFigurer ، فإن القيمة الأخيرة تتجاوز القيمة السابقة.
تعيين حبوب البيانات أعلاه كمثال:
تستخدم فئة PropertyOverridEconFigurer طريقة جديدة للرجوع إلى ملف تكوين الخصائص ، على النحو التالي:
<السياق: موقع property-override = "classpath: override.properties"/>
تختلف ملفات تكوين خاصية التسمية الخاصة بخصائص التجاوز.
datasource.driverClassName = com.mysql.jdbc.driverdatasource.url = jdbc: mysql: mydbdatasource.username = sadatasource.password = root
يدعم تعيين السمات المركبة ، ولكن يضمن أن الكائن الذي يشير إلى السمة المعينة ليست فارغة ، على سبيل المثال: foo.fred.bob.sammy = 123
مخصص مصنع الفاصوليا ما بعد المعالج
ينفذ المصنع المخصص لمصنع الفاصوليا واجهة BeanfactoryPostProcessor لإكمال تعديل بيانات تكوين الفاصوليا التي تديرها حاوية الزنبرك. على سبيل المثال: تعديل القيمة التي تم حقنها بواسطة سمات الفصل ، المثال هو كما يلي:
حدد مستخدم فئة المستخدم
الفئة العامة userbean {private string username ؛ public string getUsername () {return username ؛} public void setusername (string username) {this.username = username ؛}}يقوم ملف تكوين Spring XML بتكوين فئة المستخدم ويحقق القيمة Haha إلى اسم المستخدم لسمات المستخدم
<bean/> <bean id = "user"> <property name = "username" value = "haha"/> </bean>
فيما يلي أحد المعالجات المخصصة لمصنع الفاصوليا ، قم بتعديل قيمة اسم مستخدم العقار إلى Heihei
الطبقة العامة beanfactorypostprocsorservice تنفذ beanfactorypostprocessor {Override public void postprocessbeanfactory (configurableListableBeanfactory beanfactory) يلقي beansexception {system.out.println ( BeanDefinition bd = beanfactory.getBeanDefinition ("user") ؛ MutablePropertyValues pv = bd.getPropertyValues () ؛ if (pv.contains ("username")) {pv.addpropertyValue ("username" ، "Heihei") ؛ }}}لخص
ما سبق هو كل التفسير التفصيلي لعمليات الاسترجاعات لدورة الحياة الربيعية وملحقات الحاويات في هذه المقالة. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
مناقشة موجزة حول تطبيق التعليقات التوضيحية المخصصة في الربيع
تحليل رمز IOC في الربيع
مثال رمز استخدام معالج اعتراض springmvc مثال
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!