เป้าหมายที่ชัดเจน
ให้ฉันอธิบายปัญหาสั้น ๆ ที่บทความนี้ต้องการแก้ไข: วิธีการไม่ใช้ฤดูใบไม้ผลิอีกต่อไปเพื่อสร้างอินสแตนซ์ถั่วในฤดูใบไม้ผลิ แต่ถ่ายโอนกระบวนการสร้างถั่วไปยังนักพัฒนา
ความคิดที่ชัดเจน
วิธีสร้างอินสแตนซ์ถั่ว:
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 ใช้ถั่วซิงเกิล
ในสถานการณ์ข้างต้นสามารถสร้างถั่วผ่านวิธีการโรงงาน
ด้วยวิธีนี้เมื่อโหลด bean.xml ถั่วจะไม่ถูกสร้างอินสแตนซ์โดยตรง แต่จะเริ่มมีการสร้างอินสแตนซ์อย่างแท้จริงเมื่อวิธีการที่เรียกโดยวิธีการจากโรงงาน-วิธีการ
การใช้งาน: สร้างถั่วซิงเกิลผ่านวิธีการทำโรงงานฤดูใบไม้ผลิ
ก่อนอื่นสร้างวัตถุซิงเกิลผ่านชั้นในแบบคงที่
แพ็คเกจ com.spring.test.factorymethod; ระดับระดับสาธารณะ {โมฆะสาธารณะดำเนินการ () {system.out.println ("แสดงเริ่มต้น ... "); } private stage () {} คลาสคงที่ระดับส่วนตัว StagesingletOndholder {อินสแตนซ์เวทีคงที่ = new Stage (); } public Static Stage getInstance () {return stageingletonholder.instance; -ระบุวิธีการโหลดในไฟล์การกำหนดค่าสปริง getInstance
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <ถั่ว xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframeworkel XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
รับอินสแตนซ์โดยโทรหาถั่วในบริบทของแอปพลิเคชัน
แพ็คเกจ com.spring.test.factorymethod; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplicationContext; การทดสอบคลาสสาธารณะ Stage stage = ((ขั้นตอน) ctx.getBean ("thestage"))); //. getInstance (); stage.perform (); -ผลการดำเนินการ
24 มกราคม 2558 6:38:18 น. org.springframework.context.support.abstractaphingContext ข้อมูลการเตรียมการ: รีเฟรช org.springframework.context.support.classpathxmlapplication@512dbd1a รูทของบริบทลำดับชั้น 24, 2015 6:38:19 PM org.springframework.beans.factory.xml.xmlbeanDefinitionReader loadbeanDefinitions ข้อมูล: การโหลดคำจำกัดความของถั่ว XML จากทรัพยากรพา ธ org.springframework.beans.factory.support.defaultlistablebeanfactory preinstantiatesingletons ข้อมูล: pre-instantiating singletons ใน org.springframework.beans.factory.support.defaultlistablebeanfactory@2d1879ea รากของโรงงานประสิทธิภาพการทำงานของลำดับชั้นเริ่ม ...
เบื้องต้นเกี่ยวกับวิธีการสร้างโรงงานถั่ว
1. สร้างถั่วโดยใช้วิธีโรงงานคงที่
เมื่อสร้างอินสแตนซ์ถั่วโดยใช้วิธีการคงที่ของโรงงานคุณลักษณะคลาสจะต้องระบุด้วย แต่ในเวลานี้แอตทริบิวต์คลาสไม่ใช่คลาสการใช้งานที่ระบุอินสแตนซ์ถั่ว แต่คลาสโรงงานคงที่ เพราะฤดูใบไม้ผลิจำเป็นต้องรู้ว่าโรงงานใดที่จะใช้เพื่อสร้างอินสแตนซ์ถั่ว นอกจากนี้คุณต้องใช้วิธีการจากโรงงานเพื่อระบุชื่อวิธีการคงที่ของโรงงาน สปริงจะเรียกวิธีการคงที่จากโรงงาน (อาจมีชุดของพารามิเตอร์) เพื่อส่งคืนอินสแตนซ์ถั่ว เมื่อได้รับอินสแตนซ์ถั่วที่ระบุขั้นตอนการประมวลผลหลังจากสปริงจะเหมือนกับการสร้างอินสแตนซ์ถั่วโดยใช้วิธีการทั่วไป ควรสังเกตว่าเมื่อใช้วิธีการคงที่โรงงานเพื่อสร้างถั่ววิธีการโรงงานนี้จะต้องคงที่ ข้อความนี้ฟังดูวิงเวียนเล็กน้อยโดยไม่พูดอะไรมากโปรดเพิ่มรหัส:
ก่อนกำหนดอินเทอร์เฟซและวิธีการคงที่จะสร้างอินสแตนซ์ของอินเทอร์เฟซ:
สัตว์อินเทอร์เฟซสาธารณะ {โมฆะสาธารณะ Sayshello ();}นี่คือสองคลาสการใช้งานของอินเทอร์เฟซ:
CAT คลาสสาธารณะใช้สัตว์ {Private String MSG; // วิธีการตั้งค่าที่จำเป็นในระหว่างการฉีดพึ่งพาโมฆะสาธารณะ setMSG (สตริงผงชูรส) {this.msg = msg; } @Override โมฆะสาธารณะ Sayshello () {system.out.println (msg + ", meow ~ meow ~"); }} สุนัขระดับสาธารณะใช้สัตว์ {สตริงส่วนตัวข้อความ; // วิธีการตั้งค่าที่จำเป็นในระหว่างการฉีดพึ่งพาโมฆะสาธารณะ setMSG (สตริงผงชูรส) {this.msg = msg; } @Override โมฆะสาธารณะ Sayshello () {System.out.println (msg + ", strong ~ strong ~"); -โรงงาน AnimalFactory ด้านล่างมีวิธีการคงที่ของ getanimal ซึ่งจะกำหนดวัตถุที่จะสร้างตามพารามิเตอร์ที่ผ่าน นี่คือรูปแบบการออกแบบโรงงานแบบสแตติกทั่วไป
Public Clas AnimalFactory {Public Static Animal Getanimal (ประเภทสตริง) {ถ้า ("cat" .equalsignorecase (ประเภท)) {return cat ใหม่ (); } else {คืนสุนัขใหม่ (); -หากคุณต้องการระบุว่า Spring ใช้ AnimalFactory เพื่อสร้างวัตถุสัตว์คุณสามารถกำหนดค่าต่อไปนี้ในไฟล์การกำหนดค่าสปริง:
<!-กำหนดค่าวิธีการ getanimal ของ getanimalfactory เพื่อสร้างแมว-> <bean id = "cat" โรงงาน-วิธี = "getanimal"> <!-กำหนดค่าพารามิเตอร์ของวิธีการคงที่ของโรงงาน, วิธี getanimal-"ค่า cat-type-type /> </ebean> <!-กำหนดค่าวิธี getanimal ของ getanimalfactory เพื่อสร้างสุนัข-> <bean id = "dog" โรงงาน-วิธี = "getanimal"> <!-กำหนดค่าพารามิเตอร์ของวิธีการคงที่ของโรงงาน name = "msg" value = "dog" /> </ebean>
จากการกำหนดค่าข้างต้นเราจะเห็นได้ว่าชั้นเรียนและวิธีการจากโรงงานของการกำหนดค่าถั่วทั้งสองของแมวและสุนัขนั้นเหมือนกันเพราะทั้งสองอินสแตนซ์ถูกสร้างขึ้นโดยใช้คลาสโรงงานคงที่เดียวกันและวิธีการโรงงานคงที่เดียวกัน เป็นเพียงว่าพารามิเตอร์ที่ระบุไว้สำหรับวิธีการคงที่ของโรงงานนี้แตกต่างกันให้ใช้องค์ประกอบ <constructor-Arg />> เพื่อระบุพารามิเตอร์สำหรับวิธีการคงที่ของโรงงาน
วิธีการของโปรแกรมหลักในการรับถั่วสองอินสแตนซ์แมวและสุนัขยังคงไม่เปลี่ยนแปลง คุณจะต้องโทรหา getBean () ของภาชนะฤดูใบไม้ผลิ:
การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง 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>
เมื่อสร้างอินสแตนซ์โดยใช้วิธีการโรงงานแบบคงที่คุณต้องจัดเตรียมคลาสโรงงานและวิธีการคงที่จากโรงงานที่สร้างอินสแตนซ์ เมื่อสร้างอินสแตนซ์ด้วยวิธีการคงที่จากโรงงานคุณต้องทำการเปลี่ยนแปลงต่อไปนี้ในไฟล์การกำหนดค่าสปริง
แอตทริบิวต์คลาสไม่ใช่คลาสการใช้งานของอินสแตนซ์ถั่ว แต่คลาสโรงงานคงที่ที่สร้างอินสแตนซ์ถั่ว
ใช้วิธีการจากโรงงานเพื่อระบุวิธีการโรงงานคงที่สำหรับการผลิตอินสแตนซ์ถั่ว
หากวิธีการคงที่โรงงานต้องการพารามิเตอร์ให้ใช้องค์ประกอบ <constructor-Arg /> เพื่อกำหนดค่า
เมื่อเราระบุว่าฤดูใบไม้ผลิใช้วิธีโรงงานคงที่เพื่อสร้างอินสแตนซ์ถั่วสปริงจะแยกวิเคราะห์ไฟล์การกำหนดค่าก่อนและเรียกใช้วิธีการคงที่จากโรงงานของคลาสโรงงานคงที่ผ่านการสะท้อนตามข้อมูลที่ระบุโดยไฟล์การกำหนดค่าและใช้ค่าส่งคืนของวิธีการคงที่โรงงานเป็นอินสแตนซ์ถั่ว ในกระบวนการนี้ฤดูใบไม้ผลิจะไม่รับผิดชอบในการสร้างอินสแตนซ์ถั่วอีกต่อไปและอินสแตนซ์ถั่วนั้นจัดทำโดยวิธีโรงงานคงที่ที่ผู้ใช้ให้ไว้
2. สร้างถั่วโดยใช้วิธีการเป็นโรงงานอินสแตนซ์
วิธีการของโรงงานอินสแตนซ์นั้นแตกต่างจากวิธีการคงที่ของโรงงานเพียงเล็กน้อยเท่านั้น: การเรียกใช้วิธีการคงที่ของโรงงานเท่านั้นที่ต้องใช้คลาสโรงงานเท่านั้นและการเรียกใช้วิธีการอินสแตนซ์โรงงานจะต้องใช้อินสแตนซ์จากโรงงาน ดังนั้นจึงมีความแตกต่างเพียงหนึ่งเดียวในการกำหนดค่าฤดูใบไม้ผลิ: กำหนดค่าวิธีการคงที่โรงงานเพื่อระบุคลาสโรงงานคงที่และกำหนดค่าวิธีการอินสแตนซ์โรงงานเพื่อระบุอินสแตนซ์ของโรงงาน ตัวอย่างเดียวกันข้างต้นเปลี่ยนแปลง AnimalFactory เป็น:
Public Clas AnimalFactory {Public Animal Getanimal (ประเภทสตริง) {// ที่นี่คำหลักคงที่จะถูกลบออกเฉพาะถ้า ("cat" .equalsignorecase (ประเภท)) {return cat ใหม่ (); } else {คืนสุนัขใหม่ (); -ไฟล์สปริงได้รับการแก้ไขเป็น:
<!-กำหนดค่าคลาสโรงงานก่อน-> <bean id = "AnimalFactory" /> <!-ที่นี่เราใช้ถั่วโรงงานเพื่อระบุวัตถุระดับโรงงานอินสแตนซ์-> <bean id = "cat" โรงงาน-Bean = "AnimalFactory" Method = "Getanimal"> <! value = "cat" /> </epean> <bean id = "dog" โรงงาน Bean = "AnimalFactory" โรงงาน-method = "getanimal"> <constructor-arg value = "Dog" /> <property name = "msg" value = "dog" /> </epean>
คลาสทดสอบไม่จำเป็นต้องแก้ไขผลลัพธ์ผลลัพธ์จะเหมือนกับข้างต้น
ในหลายกรณี <bean id = "bean1" class = "... " /> ใช้เพื่อกำหนดถั่ว วิธีนี้สปริงจะเรียกตัวสร้างพารามิเตอร์เริ่มต้นเพื่อสร้างอินสแตนซ์ถั่ว นอกจากนี้คุณยังสามารถใช้โรงงานเพื่อสร้างอินสแตนซ์ถั่วเพื่อแยกการสร้างถั่วและการใช้งานและส่งมอบการสร้างถั่วให้กับโรงงานเพื่อให้เสร็จสมบูรณ์
มีสามวิธีในการกำหนดค่าถั่วจากโรงงาน
อินเทอร์เฟซบทคัดย่อ:
ImusicBox ส่วนต่อประสานสาธารณะ {public void play (); - 1. รับตัวอย่างถั่วสำหรับวิธีการคงที่โรงงาน
หมวดหมู่โรงงาน:
Public Class MusicBoxFactory {public Static ImusicBox CreateMusicBox () {กลับมาใหม่ imusicBox () {public void play () {system.out.println ("เล่นเปียโน ... "); - -ไฟล์กำหนดค่า:
<bean id = "musicbox" โรงงาน-วิธี = "createMusicbox" />>>
คลาสทดสอบ:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {applicationcontext ctx = ใหม่ classpathxmlapplicationContext ("bean-config.xml"); iMusicBox MusicBox = (iMusicBox) ctx.getBean ("MusicBox"); MusicBox.play (); -2. วิธีการของอินสแตนซ์จากโรงงานได้รับอินสแตนซ์ถั่ว
หมวดหมู่โรงงาน:
Public Class MusicBoxFactory {Public ImusicBox CreateMusicBox () {// ไม่มีการปรับเปลี่ยนแบบคงที่ส่งคืน ImusicBox ใหม่ () {public void play () {system.out.println ("เล่นเปียโน ... "); - -ไฟล์กำหนดค่า:
<Bean ID = "FactoryBean" /> <bean id = "MusicBox" โรงงาน Bean = "FactoryBean" โรงงาน-method = "createMusicBox" />>>
แอตทริบิวต์ "โรงงานถั่ว" ระบุถั่วจากโรงงานและแอตทริบิวต์ "โรงงาน-วิธี" ระบุวิธีการโรงงานเพื่อรับอินสแตนซ์ถั่ว
คลาสทดสอบ:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {applicationcontext ctx = ใหม่ classpathxmlapplicationContext ("bean-config.xml"); iMusicBox MusicBox = (iMusicBox) ctx.getBean ("MusicBox"); MusicBox.play (); - 3. คลาสโรงงานใช้ org.springframework.beans.factory.facotrybean อินเตอร์เฟส
หมวดหมู่โรงงาน:
นำเข้า org.springframework.beans.factory.factorybean; Public Class MusicBoxFactory2 ใช้ FactoryBean {วัตถุสาธารณะ getObject () โยนข้อยกเว้น {ส่งคืน imusicBox ใหม่ () {public void play () {system.out.println ("เล่นเปียโน ... "); - } คลาสสาธารณะ getObjectType () {return imusicbox.class; } บูลีนสาธารณะ issingleton () {return false; -ไฟล์กำหนดค่า:
<bean id = "musicbox"/>
คลาสทดสอบ:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {applicationcontext ctx = ใหม่ classpathxmlapplicationContext ("bean-config.xml"); // ไม่ได้เพิ่มและส่งคืน "ผลิตภัณฑ์" ของโรงงาน ImusicBox MusicBox = (iMusicBox) ctx.getBean ("MusicBox"); MusicBox.play (); // เพิ่ม & ส่งคืนวัตถุอินสแตนซ์คลาสโรงงาน obj = ctx.getBean ("& musicbox"); System.out.println (obj.getClass (). getName ()); -คลาสที่ใช้อินเทอร์เฟซ FactoryBean จะไม่ถูกมองว่าเป็นถั่วธรรมดาสปริงจะตรวจจับพวกเขาโดยอัตโนมัติและเรียกใช้วิธี getObject เพื่อรับอินสแตนซ์ถั่ว
สรุป
นี่คือจุดสิ้นสุดของการแนะนำอินสแตนซ์ถั่วอินสแตนซ์ในวิธีการของโรงงานฤดูใบไม้ผลิ หากคุณมีข้อบกพร่องใด ๆ คุณสามารถฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!