نطاق الفول عديمي الجنسية هو مثيل سينجلتون. إذا حقن الفاصوليا B من النموذج الأولي في الفاصوليا A من Singleton ونأمل أن يتم إرجاع حبة جديدة B في كل مرة يتم استدعاء getBeanb () من الفول A ، لا يمكن تحقيق هذا المطلب باستخدام طرق الحقن التقليدية. نظرًا لأن عمل حقن الفاصوليا في سينغلتون يحدث مرة واحدة فقط ، على الرغم من أن نطاق الفاصوليا B هو نوع النموذج الأولي ، فإن الكائن الذي يتم إرجاعه من خلال getBeanb () لا يزال الفول B الذي تم حقنه في البداية.
لذا ، إذا كنت ترغب في إرجاع Beanb جديد في كل مرة تتصل فيها بـ Beana's GetBeanb () ، فإن الحل الاختياري هو السماح لـ Beana بتنفيذ واجهة Beanfactoryaware ، بحيث يمكنك الوصول إلى الحاوية ، ثم تنفيذها بالطريقة التالية.
تكوين XML أولاً:
<bean id = "uptor" scope = "prototype"/> <bean id = "book" p: name = "veil"> </bean>
تم تعيين نطاق مؤلف بين على النموذج الأولي.
ينفذ فئة الكتاب واجهة Beanfactoryaware:
يقوم كتاب الطبقة العامة بتنفيذ beanfactoryaware {...@@overridepublic void setBeanfactory (beanfactory beanfactory) يلقي beansexception {this.factory = beanfactory ؛} المؤلف العام getProtytypeAuthor () {return (efream) factory.getbean ("المؤلف") ؛ }}اختبارات الوحدة:
ApplicationContext Context ؛ beforemethodpublic void setup () يلقي استثناء {context = new classPathxMlApplicationContext ("Beans5-5 system.out.println (book.getAuthor (). hashcode ()) ؛ system.out.println (book.getAuthor (). hashcode ()) ؛ System.out.println (book.getProtypeAuthor (). hashcode ()) ؛ System.out.println (book.getProtypeAuthor (). hashcode ()) ؛نتائج الاختبار
من النتائج ، يمكننا أن نرى أن مثيلات المؤلف التي تم الحصول عليها فقط من Beanfactory مختلفة.
يربط هذا التطبيق التطبيق باستخدام إطار الربيع. هل هناك حل أفضل؟ نعم ، إنها طريقة الحقن.
1 طريقة الحقن
تعتمد حاويات الربيع على مكتبات CGLIB ، لذلك يمكن تشغيل رمز الفئة من الفئة ديناميكيًا أثناء وقت التشغيل ، مثل إنشاء فئات فرعية أو فئات تنفيذ من الفاصوليا.
واجهة BookInterface:
الواجهة العامة BookInterface {Author GetAuthor () ؛}تكوين XML:
<!-حقن الأسلوب-> <bean id = "uptor" scope = "prototype" p: name = "maugham"/> <bean id = "book2"> <lookup-method name = "getauthor" bean = "uputh"/> </bean>
اختبارات الوحدة:
BookInterface Book = (BookInterface) context.getBean ("book2") ؛ assert.assertequals ("maugham" ، book.getauthor ().من خلال طريقة التكوين هذه ، يمكن توفير التنفيذ الديناميكي للواجهة ، والفاصوليا التي يتم إرجاعها بهذه الطريقة كلها مثيلات جديدة.
لذلك ، إذا كنت ترغب في الحصول على نموذج أولي في حبة مفردة ، فيمكنك استخدام البحث لتنفيذ طريقة الحقن.
2 طريقة الاستبدال
في فصل الربيع ، يمكنك استخدام طريقة لفاصوليا معينة لاستبدال طريقة أخرى من الفول.
افترض أن هناك طريقة getName () في كتاب للحصول على العنوان:
/*** عنوان الكتاب*/اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛}نقوم الآن بإنشاء حبة جديدة ، والتي تنفذ واجهة MethentReplacer لاستبدال طريقة getName () في الكتاب:
يقوم كتاب الفئة العامة Book4 بتنفيذ MethentReplacer {Override Public Object Reacting (Object OBJ ، method ، Object [] args) رمي {return "Alive" ؛ }}إعدادات:
<bean id = "book3" p: name = "bright thitts suns"> <استبدال name-method = "getName" replacer = "book4"/> </bean> <bean id = "book4"/>
امتحان:
كتاب كتاب = (كتاب) سياق.
لخص
ما سبق هو تنفيذ طريقة الحقن أو الاستبدال في إطار الربيع الذي أدخله المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر على الجميع في الوقت المناسب!