هدف محدد
اسمحوا لي أن أصف باختصار المشكلة التي تريد هذه المقالة حلها: كيفية عدم استخدام الربيع لإنشاء مثيلات الفول في الربيع ، ولكن نقل عملية إنشاء الفول إلى المطورين.
تفكير واضح
كيفية إنشاء مثيل بين:
1) من خلال المنشئ (مع أو بدون معلمات)
الطريقة: <bean id=""/>
2) من خلال طريقة المصنع الثابت
الطريقة: <bean id="" factory-method="静态工厂方法"/>
ملاحظة: لم يتم إنشاء مثيل فئة المصنع
3) من خلال طريقة مصنع المثيل (طريقة غير قاسية)
طريق:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
ملاحظة: يتم إنشاء مثيل فئة المصنع
طريقة عملية
مثال 1 :
يحتاج:
1 لا أرغب في إنشاء مثيل للحبوب عند تحميل Bean.xml ، لكنني أريد فصل bean.xml المحملة عن الكائن الذي تم إنشاءه.
2 تنفيذ Singleton Bean
في المواقف المذكورة أعلاه ، يمكن إنشاء الفاصوليا من خلال ميثود المصنع.
وبهذه الطريقة ، عندما يتم تحميل Bean.xml ، لن يتم إنشاء مثيل للفاصوليا مباشرة ، ولكن لن تبدأ إلا في إنشاء مثيل لها عندما تسمى الطريقة التي يشار إليها بواسطة طريقة المصنع.
التنفيذ: قم بإنشاء فول مفردة من خلال الربيع في مصنع
قم أولاً بإنشاء كائن Singleton من خلال فئة داخلية ثابتة
package com.spring.test.factorymethod ؛ مرحلة الفئة العامة {public void perform () {system.out.println ("show start ...") ؛ } المرحلة الخاصة () {} فئة ثابتة خاصة StagesingleTonHolder {static Stage extal = new Stage () ؛ } المرحلة الثابتة العامة getInstance () {return stagesingletonholder.instance ؛ }}حدد طريقة التحميل في ملف تكوين الربيع getInstance
<؟ XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <sestage
احصل على مثيل عن طريق الاتصال بالفاصوليا في سياق التطبيق
package com.spring.test.factorymethod ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlablicationcontext ؛ classpathxmlapplicationContext ("bean.xml") ؛ مرحلة المرحلة = ((المرحلة) ctx.getBean ("thestage")) ؛ //. getInstance () ؛ stage.perform () ؛ }}نتائج التنفيذ
24 يناير 2015 6:38:18 PM org.springframework.context.support.abstractapplicationContext المعلومات: org.springframework.context.cst.cst.cspathxmlabplicationcontext@512dbd1a: startub جذر السياق التسلسل الهرمي 24 ، 2015 6:38:19 مساءً org.springframework.beans.factory.xml.xmlbeandefinitionReader loadbeandefinitions المعلومات: تحميل تعريفات XML من مسار الفصل [bean.xml] 24 يناير ، 6:38:19 PM org.springframework.beans.factory.support.defaultBlistableBeanfactory preinstantiatesletons المعلومات: المفردات المسبقة في org.springframewwork.beans.factory.support.defaultbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbeanbean. ثيستاج] ؛ جذر المصنع يبدأ أداء التسلسل الهرمي ...
مقدمة إلى BACKTORY CRESITION BEAN
1. قم بإنشاء فول باستخدام طريقة مصنع ثابتة
عند إنشاء مثيل بين الفول باستخدام طريقة المصنع الثابت ، يجب أيضًا تحديد سمة الفصل ، ولكن في هذا الوقت ، فإن سمة الفصل ليست فئة التنفيذ التي تحدد مثيل الفول ، ولكن فئة المصنع الثابت. لأن الربيع يحتاج إلى معرفة المصنع الذي يجب استخدامه لإنشاء مثيل الفول. بالإضافة إلى ذلك ، تحتاج إلى استخدام ميثود المصنع لتحديد اسم طريقة المصنع الثابت. سيقوم الربيع باستدعاء طريقة المصنع الثابت (قد تحتوي على مجموعة من المعلمات) لإرجاع مثيل الفول. بمجرد الحصول على مثيل Bean المحدد ، تكون خطوات المعالجة بعد الربيع هي نفسها تمامًا إنشاء مثيل Bean باستخدام طرق عادية. تجدر الإشارة إلى أنه عند استخدام أساليب المصنع الثابتة لإنشاء الفاصوليا ، يجب أن تكون هذه الأساليب في المصنع ثابتة. يبدو هذا المقطع بالدوار قليلاً ، دون أن يقول الكثير ، يرجى إضافة الرمز:
حدد أولاً واجهة ، وستنتج الطريقة الثابتة مثيل الواجهة:
الواجهة العامة Animal {public void sealhello () ؛}فيما يلي فئتان للتنفيذ في الواجهة:
CLASS CAT PURCITION تنفذ Animal {Private String MSG ؛ . } Override public void sealhello () {system.out.println (msg + "، meow ~ meow ~") ؛ }} class class class ينفذ Animal {private string msg ؛ . } Override public void sealhello () {system.out.println (msg + "، strong ~ strong ~") ؛ }}يحتوي مصنع AnimalFactory أدناه على طريقة ثابتة لـ GetAnimal ، والتي ستحدد أي كائن يجب إنشاؤه بناءً على المعلمات التي تم تمريرها. هذا هو نمط تصميم مصنع ثابت نموذجي.
Public Clas AnimalFactory {public static Animal getAnimal (نوع السلسلة) {if ("cat" .equalsignorecase (type)) {return new cat () ؛ } آخر {return new dog () ؛ }}}إذا كنت بحاجة إلى تحديد أن Spring يستخدم AnimalFactory لإنشاء كائنات حيوانية ، فيمكنك تكوين ما يلي في ملف تكوين الربيع:
<!-تكوين طريقة getanimalfactory's getAnimal لإنشاء cat-> <bean id = "cat" المصنع- method = "getAnimal"> <!-تكوين معلمات طريقة المصنع الثابت ، فإن طريقة getanimal ستولد كائنات cat-type-> <structor-arg value = cat " /> <! value = "cat" /> </bean> <!-تكوين طريقة getAnimalFactory's getAnimal لإنشاء الكلب-> <bean id = "dog" method-method = "getanimal"> <! setter-> <property name = "msg" value = "dog" /> </bean>
من التكوين أعلاه ، يمكننا أن نرى أن الفئة والمصنع لتكوين الفاصوليا من Cat and Dog متماثلان تمامًا ، لأن كلتا الحالتين يتم إنشاؤها باستخدام نفس فئة المصنع الثابتة وطريقة المصنع الثابتة نفسها. إنه فقط أن المعلمات المحددة لطريقة المصنع الثابت هذه مختلفة ، استخدم عنصر <منشئ ARG /> لتحديد المعلمات لطريقة المصنع الثابت.
طريقة البرنامج الرئيسي للحصول على مثيلتين للقطن والكلب لا يزال دون تغيير. تحتاج فقط إلى استدعاء getBean () من حاوية الربيع:
اختبار الفئة العامة {public static void main (String args []) {ApplicationContext context = جديد classPathxMlAppLicationContext ("ApplicationContext.xml") ؛ Animal A1 = Context.getBean ("Cat" ، Animal.Class) ؛ a1.sayhello () ؛ Animal A2 = Context.getBean ("dog" ، Animal.Class) ؛ A2.Sayhello () ؛ }}نتيجة الإخراج:
<code> Cat ، Meow ~ Meow ~ Dog ، Strong ~ Strong ~ </code>
عند إنشاء مثيل باستخدام طريقة مصنع ثابت ، يجب عليك توفير فئة المصنع وطريقة المصنع الثابتة التي تولد المثيل. عند إنشاء مثيل من خلال طريقة مصنع ثابت ، تحتاج إلى إجراء التغييرات التالية في ملف تكوين الربيع ؛
سمة الفصل ليست فئة التنفيذ لمثيل الفول ، ولكن فئة المصنع الثابتة التي تنشئ مثيل الفول
استخدم ميثود المصنع لتحديد طريقة مصنع ثابتة لإنتاج مثيل الفول
إذا كانت طريقة المصنع الثابتة تتطلب معلمات ، فاستخدم عنصر <بنشئت ARG /> لتكوينه
عندما نحدد أن Spring يستخدم طريقة مصنع ثابتة لإنشاء مثيل Bean ، ستقوم Spring أولاً بتحليل ملف التكوين ، واستدعاء طريقة المصنع الثابت لفئة المصنع الثابت من خلال الانعكاس بناءً على المعلومات المحددة بواسطة ملف التكوين ، واستخدام قيمة الإرجاع لطريقة المصنع الثابتة كمثيل الفول. في هذه العملية ، لم يعد Spring مسؤولاً عن إنشاء مثيل Bean ، ويتم توفير مثيل Bean بواسطة طريقة المصنع الثابت التي يوفرها المستخدم.
2. قم بإنشاء فول باستخدام طريقة مصنع المثيل
لا تختلف طريقة مصنع المثيل عن طريقة المصنع الثابتة فقط: لا يتطلب استدعاء طريقة المصنع الثابت سوى استخدام فئة المصنع ، ويجب أن تستخدم استدعاء طريقة المصنع مثيل المصنع. لذلك ، لا يوجد سوى اختلاف واحد في تكوين الربيع: قم بتكوين طريقة المصنع الثابت لتحديد فئة المصنع الثابت ، وتكوين طريقة مصنع المثيل لتحديد مثيل المصنع. نفس المثال أعلاه يغير AnimalFactory إلى:
Public Clas AnimalFactory {public Animal getanimal (نوع السلسلة) {// هنا ، تتم إزالة الكلمة الرئيسية الثابتة فقط إذا ("cat" .equalsignorecase (type)) {return new cat () ؛ } آخر {return new dog () ؛ }}}يتم تعديل ملف الربيع إلى:
<!-قم بتكوين فئة المصنع أولاً-> <bean id = "animalfactory" /> <!-هنا نستخدم مصنع bean لتحديد كائن فئة المصنع للمثال-> <bean id = "cat" factory-bean = "AnimalFactory" method = "msanimal"> <! value = "cat" /> </bean> <bean id = "dog" factory-bean = "animalfactory" factory-method = "getanimal"> <constructor-arg value = "dog" /> <propert
لا يلزم تعديل فئة الاختبار ، ونتائج الإخراج هي نفسها كما هو موضح أعلاه.
في كثير من الحالات ، يتم استخدام <bean id = "bean1" class = "..." /> لتحديد الفول. وبهذه الطريقة ، سيتصل الربيع بالمشارك الافتراضي بدون المعلمة لإنشاء مثيل بين الفول. بالإضافة إلى ذلك ، يمكنك أيضًا استخدام المصنع لإنشاء مثيلات الفول لفصل إنشاء الفاصوليا واستخدامه ، وتسليم أعمال إنشاء الفول إلى المصنع لإكمالها.
هناك ثلاث طرق لتكوين حبوب المصنع.
واجهة مجردة:
الواجهة العامة imusicbox {public void play () ؛ } 1. الحصول على أمثلة على الفول لطريقة المصنع الثابت
فئة المصنع:
الفئة العامة MusicBoxFactory {public static imusicbox createMusicBox () {return new imusicbox () {public void play () {system.out.println ("play piano ...") ؛ }} ؛ }}ملف التكوين:
<bean id = "musicbox" المصنع-
فئة الاختبار:
public static void main (string [] args) {applicationContext ctx = new ClassPathxMlAppLicationContext ("Bean-config.xml") ؛ imusicbox musicbox = (imusicbox) ctx.getBean ("musicbox") ؛ musicbox.play () ؛ }2. طريقة مثيل المصنع تحصل على مثيل بين
فئة المصنع:
الفئة العامة MusicBoxFactory {public imusicbox createMusicBox () {// لا تعديل ثابت إرجاع imusicbox () {public void play () {system.out.println ("play piano ...") ؛ }} ؛ }}ملف التكوين:
<bean id = "factorybean" /> <bean id = "musicbox" factory bean = "factorybean" factory-method = "createMusicBox" />
تحدد سمة "مصنع Bean" حبة المصنع ، وتحدد سمة "Method-Method" طريقة المصنع للحصول على مثيل Bean.
فئة الاختبار:
public static void main (string [] args) {applicationContext ctx = new ClassPathxMlAppLicationContext ("Bean-config.xml") ؛ imusicbox musicbox = (imusicbox) ctx.getBean ("musicbox") ؛ musicbox.play () ؛ } 3. فئة المصنع تنفذ org.springframework.beans.factory.facotrybean واجهة
فئة المصنع:
استيراد org.springframework.beans.factory.factorybean ؛ الفئة العامة MusicBoxFactory2 تنفذ Factorybean {public Object getObject () يلقي الاستثناء {return new imusicbox () {public void play () {system.out.println ("" play piano ... ") ؛ }} ؛ } الفئة العامة getObjectType () {return imusicbox.class ؛ } boolean public issingleton () {return false ؛ }}ملف التكوين:
<bean id = "musicbox"/>
فئة الاختبار:
public static void main (string [] args) {applicationContext ctx = new ClassPathxMlAppLicationContext ("Bean-config.xml") ؛ // لم يتم إضافتها وإرجاع "منتج" المصنع ImusicBox MusicBox = (ImusicBox) ctx.getBean ("MusicBox") ؛ musicbox.play () ؛ // إضافة وإرجاع كائن مثيل فئة المصنع obj = ctx.getBean ("& musicbox") ؛ system.out.println (obj.getClass (). getName ()) ؛ }لن يتم اعتبار الفصول التي تنفذ واجهة Factorybean فاصوليا عادية ، وسوف يكتشفها Spring تلقائيًا ، واستدعاء طريقة getObject للحصول على مثيل Bean.
لخص
هذه هي نهاية مقدمة مثيلات الفول في أساليب مصنع الربيع. إذا كان لديك أي أوجه قصور ، فيمكنك ترك رسالة للإشارة. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!