توفر واجهة التهيئة وسيلة لتهيئة طرق الفول. ويشمل فقط طريقة ما بعد propertiesset. أي فئة ترث الواجهة ستنفذ الطريقة عند تهيئة الحبة.
تم اختباره على النحو التالي:
استيراد org.springframework.beans.factory.InitializingBean ؛ الطبقة العامة testInitializingBean تنفذ تهيئة {Override public void بعد propertiesset () استثناء {system.out.println ("ceshi initializingbean") ؛ } public void testinit () {system.out.println ("ceshi init-method") ؛ }}ملف التكوين
<bean id = "testInitializingBean"> </ban>
الوظيفة الرئيسية هي كما يلي
الفئة العامة الرئيسية {public static void main (string [] args) {ApplicationContext context = new fileystemsmlapplicationContext ("/src/main/java/com/beans.xml") ؛ }}نتائج الاختبار هي:
Ceshi التهيئة
هذا يعني أنه عندما يقوم Spring بتهيئة الفاصوليا ، إذا قام الفول بتنفيذ واجهة التهيئة ، فسيتم استدعاء طريقة ما بعد propertiesset تلقائيًا.
وبالتالي فإن المشكلة هي أنه عند تكوين الفاصوليا ، يمكنك أيضًا تكوين طريقة التهيئة للفول باستخدام تكوين Method. أي من هذين سيتم تنفيذه أولاً؟ بعد ذلك ، اختبره ، وتعديل ملف التكوين ، وإضافة Method:
<bean id = "testInitializingBean" init-method = "testinit"> </bean>
قم بتشغيل البرنامج واحصل على النتيجة:
Ceshi التهيئة
Ceshi init-method
من النتائج ، يمكننا أن نرى أنه عندما يقوم Spring بتهيئة الفاصوليا ، إذا قام الفاصوليا بتنفيذ واجهة التهيئة وحدد الطائرات الأولى في ملف التكوين ، فإن النظام أولاً يستدعي طريقة ما بعد propertieset () ، ثم يستدعي الطريقة المحددة في Method init.
فكيف يتم تنفيذ هذه الطريقة في الربيع؟ من خلال النظر إلى فئة الكود المصدري لفاصوليا تحميل الربيع ، يمكنك رؤية الغموض. إن invokeinitmethods في فئة AbstractAutowiredCapableBeanfactory واضحة للغاية ، على النحو التالي:
invokeinitmethods void المحمية (سلسلة Beanname ، فول الكائن النهائي ، RootBeanDefinition MBD) يلقي رمي {// ugge ما إذا كانت الفول قد نفذت واجهة التهيئة. إذا تم تنفيذ واجهة التهيئة ، فإن طريقة ما بعد propertiesset فقط تسمى Boolean IsinitializingBean = (مثيل الفول من التهيئة) ؛ if (isInitializingBean && (mbd == null ||! mbd.isexternallymanagedInitMethod ("بعد propertiesset"))) {if (logger.isdebugenabled ()) {logger.debug ( } if (system.getSecurityManager ()! = null) {try {AccessController.doprivileged (new terilegedexceptionAction <Bounge> () {public object Run () rems {// call referpropertiesset ((initializingbean). } catch (terilegedActionException pae) {throw pae.getException () ؛ }} else {// call مباشرة بعد propertiesset ((initializingBean) Bean) .AfterPropertiesset () ؛ }}} if (mbd! = null) {string initMethodName = mbd.getInitMethodName () ؛ // التمييز بين ما إذا كان يتم تحديد طريقة Method. إذا تم تحديد طريقة init-method ، فعندئذٍ ، إذا كان (initmethodname! = null &&! (isInitializingBean && "بعد propertiesset" .equals (initmethodname)) طريقة init-method هي تنفيذ InvokecUstominitMethod (Beanname ، Bean ، MBD) ؛ }}}تلخيص:
1. يوفر Spring Beans بطريقتين لتهيئة الفاصوليا ، وتنفيذ واجهة التهيئة ، أو تنفيذ طريقة ما بعد propertiesset ، أو تحديدها من خلال طريقة init في ملف التكوين. يمكن استخدام كلتا الطريقتين في نفس الوقت.
2. تنفيذ واجهة التهيئة مباشرة يستدعي طريقة ما بعد propertiesset ، والتي هي أكثر كفاءة بقليل من استدعاء الطريقة المحددة من خلال طريقة init من خلال الانعكاس ، ولكن طريقة INIT-METHOD تلغي الاعتماد على الربيع.
3. إذا حدث خطأ عند استدعاء طريقة بعد propertiesset ، لا تسمى الطريقة المحددة بواسطة Methode init.
دور الربيع تهيئة
واجهة Spring's Pitchbean مفيدة للغاية. وهي تقع في حبوب الربيع. إنه يوفر طريقة واحدة فقط بعد propertiesset (). عندما تقوم بتنفيذ هذه الطريقة ، ستزودك Spring بدعم على مستوى الإطار: عندما تقوم بإنتاج مثيل للفئة التي تنفذ الواجهة من خلال حاوية SRING ، فإنها ستسمي طريقة ما بعد propertiesset. من خلال هذه الطريقة ، يمكنك التحقق مما إذا كان يتم تهيئة الفول بشكل صحيح. بالطبع ، يمكنك أيضًا استخدام طريقة init-method. يمكن استخدام هاتين الطريقتين في نفس الوقت ، وترتيب المكالمات هو Method-Method.
لخص
ما سبق هو استخدام واجهة التهيئة في الربيع الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!