مقدمة
تقدم هذه المقالة بشكل أساسي المحتوى ذي الصلة حول البحث (حقن الطريقة) في الربيع. يتم مشاركته للرجوع إليه وتعلمك. لن أقول الكثير أدناه. دعونا نلقي نظرة على المقدمة التفصيلية معًا:
قد يحدث هذا عند استخدام الربيع: يعتمد أحد الفاصوليا المفردة على فاصوليا أخرى غير سينغليتون. إذا كنت ببساطة تستخدم التجميع التلقائي لحقن التبعيات ، فقد تنشأ بعض المشكلات ، كما هو موضح أدناه:
الفئة أ من أجل المفرد
classa classa classa {autowired private classb ؛ public void printclass () {system.out.println ("هذه هي الفئة A:" + هذا) ؛ classb.printclass () ؛ }}الفئة ب لعدم الانزلاق
@component@scope (value = scope_prototype) classb classb {public void printclass () {system.out.println ("هذا هو الفئة ب:" + هذا) ؛ }} هنا تعتمد الفئة A على نطاق Singleton الافتراضي ويعتمد على الفئة B. نطاق الفئة B هو النموذج الأولي ، لذلك ليس مفردة. في هذا الوقت ، يمكنك رؤية مشكلة الكتابة مثل هذا بعد إجراء اختبار:
Runwith (SpringRunner.Class) contextConfiguration (classes = {classa.class ، classb.class}) الفئة العامة mytest {autowired private classa ؛ test public void simpleTest () {for (int i = 0 ؛ i <3 ؛ i ++) {classa.printclass () ؛ }}}نتيجة الإخراج هي:
هذا هو الفئة A: classa@282003e1
هذا هو الفئة ب: classb@7fad8c79
هذا هو الفئة A: classa@282003e1
هذا هو الفئة ب: classb@7fad8c79
هذا هو الفئة A: classa@282003e1
هذا هو الفئة ب: classb@7fad8c79
كما ترون ، فإن رمز التجزئة لكلا الفئتين هو نفسه في المخرجات الثلاثة. من المفهوم أن قيمة الفئة "أ" تظل دون تغيير لأنها مفردة ، لكن نطاق الفئة ب هو نموذج أولي ولكنه يحافظ أيضًا على رمز التجزئة دون تغيير ، والذي يبدو أنه أصبح مفردة؟
والسبب في هذا الموقف هو أن نطاق الفئة A هو Singleton الافتراضي ، وبالتالي فإن السياق لن ينشئ فول الفئة A إلا مرة واحدة ، لذلك لا توجد سوى فرصة واحدة لضخ التبعيات ، ولا يمكن للحاوية توفير الفئة A مع فئة B جديدة في كل مرة.
ليس حل جيد جدا
لحل المشكلة أعلاه ، يمكنك إجراء بعض التعديلات على الفئة A لتنفيذ ApplicationContextAware.
class classa classa class class application applicationcontaware {private applicationContext ApplicationContext ؛ public void printclass () {system.out.println ("هذه هي الفئة A:" + هذا) ؛ getClassB (). printclass () ؛ } classb getClassB () {return applicationContext.getBean (classb.class) ؛ } public void setapplicationContext (ApplicationContext ApplicationContext) يلقي beansexception {this.applicationContext = ApplicationContext ؛ }}وبهذه الطريقة ، يمكنك العثور يدويًا على حبة جديدة في السياق في كل مرة تحتاج فيها للذهاب إلى الفئة ب. بعد إجراء اختبار آخر ، حصلت على الإخراج التالي:
هذا هو الفئة A: com.devhao.classa@4df828d7
هذه الفئة ب: com.devhao.classb@31206bebb
هذا هو الفئة A: com.devhao.classa@4df828d7
هذا هو الفئة ب: com.devhao.classb@3e77a1ed
هذا هو الفئة A: com.devhao.classa@4df828d7
هذا هو الفئة ب: com.devhao.classb@3ffcd140
يمكنك أن ترى أن رمز التجزئة للفئة A يبقى دون تغيير في المخرجات الثلاثة ، في حين أن الفئة B مختلفة في كل مرة ، مما يدل على أنه تم حل المشكلة ويتم استخدام المثيل الجديد في كل مرة يطلق عليها.
ومع ذلك ، فإن طريقة الكتابة هذه مقترنة بقوة مع الربيع ، ويوفر الربيع طريقة أخرى لتقليل الغزو.
@ابحث عن
يوفر Spring تعليقًا توضيحيًا يسمى @Lookup ، وهو شرح توضيحي يعمل على الطريقة. سيتم تجاوز الطريقة التي تتميز بها. ثم ، وفقًا لنوع قيمة الإرجاع الخاصة به ، تستدعي الحاوية طريقة getBean () لـ Beanfactory لإعادة الفول.
classa classa classa {public void printclass () {system.out.println ("هذه هي الفئة A:" + this) ؛ getClassB (). printclass () ؛ } lookup public classb getClassB () {return null ؛ }} يمكن العثور على أنه أبسط بكثير ولم يعد مقترنًا بقوة بالربيع. لا يزال بإمكان إجراء الاختبار مرة أخرى الحصول على الإخراج الصحيح.
لم تعد قيمة الإرجاع للطريقة المشروحة مهمة ، لأن الحاوية ستنشئ بشكل ديناميكي فئة فرعية ثم إعادة كتابة/تنفيذ طريقة المشروح ، ويتم استدعاء طريقة الفئة الفرعية أخيرًا.
يجب أن تتوافق طريقة @lookup المستخدمة مع التوقيع التالي:
<public | protected> [الملخص] <Type-type> themethodname (no-arguments) ؛
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.