การอ้างอิงอย่างง่ายสำหรับการใช้ Spring-IOC:
การวิเคราะห์อินสแตนซ์ง่าย ๆ ของสปริง IOC และคุณลักษณะขอบเขตของถั่ว
1. ฉีดประเภทข้อมูลที่แตกต่างผ่านวิธีการตั้งค่า
รหัสคลาสทดสอบ (คุณสมบัติที่ฉีดในวิธีการตั้งค่าจะต้องเพิ่มด้วยวิธีการตั้งค่า)
/** ตัวอย่างการฉีดผ่านวิธีการตั้งค่า*/คลาสสาธารณะ IOC_BY_SET {/** พารามิเตอร์ประเภทจำนวนเต็มฉีดพารามิเตอร์*/ID จำนวนเต็มส่วนตัว;/** พารามิเตอร์ประเภทสตริงฉีดพารามิเตอร์*/ชื่อสตริงส่วนตัว;/** การฉีดเอนทิตี **/ผู้ใช้ส่วนตัว set;/** การฉีดแผนที่คู่-ค่าคีย์*/แผนที่ส่วนตัว <วัตถุวัตถุ> แผนที่;/** คุณสมบัติการฉีดประเภท*/คุณสมบัติส่วนตัวคุณสมบัติ;/** ฉีดสตริงว่างเปล่า*/สตริงส่วนตัวว่างเปล่า; null) {return false;} else {system.out.println ("id:" + id);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ชื่อ);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - อาร์เรย์) {system.out.println (object.toString ());}} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------- - {system.out.println ("set:"); สำหรับ (วัตถุวัตถุ: set) {system.out.println (object.toString ());}} system.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------- - {system.out.println (entry.getKey () + "|" + entry.getValue ());}} system.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - entry.getValue ());}} system.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - setName (ชื่อสตริง) {this.name = name;} public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;} โมฆะสาธารณะ setarray (วัตถุ [] อาร์เรย์) {this.array = array;} public void setlist setMap (แผนที่ <วัตถุ, วัตถุ> แผนที่) {this.map = map;} โมฆะสาธารณะ setProperties (คุณสมบัติคุณสมบัติ) {this.properties = คุณสมบัติ;} โมฆะสาธารณะ setemptyValue (สตริงว่างเปล่า) nullValue;}}การกำหนดค่า ApplicationContext.xml
<!-ตั้งค่าการฉีด-> <bean id = "ioc_by_set"> <!-แอตทริบิวต์ ID การฉีด-> <property name = "id" value = "1"/> <!-การใช้ <!-การจัดการอักขระพิเศษ XML ด้วย <!-การใช้ <! <value> <! [cdata [p & g]]> </value> </property> <!-การกำหนดการฉีดถั่วภายใน-> <property name = "user"> <bean> <property name = "id" value = "1"/> <property name = "username" value = "Bean Internal" name = "array"> <array> <!-กำหนดองค์ประกอบอาร์เรย์-> <value> array01 </value> <value> array02 </value> <alues> array03 </value> </array> </คุณสมบัติ> <! <value> list03 </value> </list> </porement> <!-ประเภทชุดชุด-> <porement> <คุณสมบัติ --- กำหนดองค์ประกอบในรายการ-> <value> list02 </value> <value> list03 </value> </list> </คุณสมบัติ> <! <value> set02 </value> <value> set03 </value> </set> </คุณสมบัติ> <!-การฉีดประเภทแผนที่-> <property name = "map"> <pect> <!-กำหนดคู่คีย์-ค่าในแผนที่-> <entry> <dalues> mapkey01 </value> <value> MAPKEY02 </value> </sure> <value> MAPVALUE02 </value> </sentry> </map> </คุณสมบัติ> <!-การฉีดประเภทคุณสมบัติ-> <property name = "properties"> <props> <! key = "propkey2"> propValue2 </prop> </props> </perty> <!-ฉีดสตริงว่าง-> <property name = "emportvalue"> <value> </alues> </property> <!
รหัสทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_set"); ioc.checkattr ();}}ผลลัพธ์ของคอนโซล:
ID: 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 3 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -
2. ฉีดแอตทริบิวต์ประเภทต่าง ๆ ผ่านวิธีการก่อสร้าง
หมายเหตุ: เมื่อใช้เวอร์ชัน JDK1.8 โปรดอัพเกรดแพ็คเกจ JAR ที่เกี่ยวข้องกับสปริงเป็นเวอร์ชัน 4.x หรือสูงกว่ามิฉะนั้นตัวสร้างที่เข้ากันไม่ได้จะถูกฉีด
รหัสชั้นเรียนทดสอบ
/** ตัวอย่างของการฉีดผ่านตัวสร้าง*/คลาสสาธารณะ IOC_BY_CONSTRUCTOR {ID จำนวนเต็มส่วนตัวชื่อสตริงส่วนตัวผู้ใช้ส่วนตัวผู้ใช้รายการส่วนตัว <BOJICT> รายการ IOC_BY_CONSTRUCTOR สาธารณะ () {} IOC_BY_CONSTRUCTOR (ID.NAME. list;}/** ตรวจสอบว่าการฉีดสำเร็จ*/public boolean checkattr () {ถ้า (id == null) {return false;} anle} {system.out.println ("id:" + id);} system.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - + "|" + user.getUserName () + " user.getPassword ());} system.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - จริง;}}การกำหนดค่า ApplicationContext.xml
<!-constructor-arg value = "p & g"/> <!-วัตถุฉีด-> <bean id = "ioc_by_constructor"> <!-วัตถุฉีด-> <bean> <constructor-arg value = "1" type = "java.lang.integer"/> <! <constructor-Arg> <!-วัตถุในตัว-> <bean> <constructor-Arg value = "1"/> <constructor-Arg value = "การก่อสร้างถั่วภายใน"/> <constructor-Arg value = "666"/> </epan> <value> list02 </value> <value> list03 </value> </list> </constructor-Arg> </ebean>
รหัสทดสอบ:
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("ApplicationConstructor IOC = (IOCSTRUCTOR IOC = (IOCONSTRICTOR ctx.getBean ("ioc_by_constructor"); ioc.checkattr ();}}ผลลัพธ์ของคอนโซล:
ID: 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -
3. การฉีดอัตโนมัติ (ชุดประกอบอัตโนมัติ)
แม้ว่าแอสเซมบลีอัตโนมัติสามารถบันทึกรหัสบางส่วนได้ แต่ก็ไม่แนะนำให้ใช้งาน
รหัสชั้นเรียนทดสอบ:
/** การฉีดแอสเซมบลีอัตโนมัติ*/คลาสสาธารณะ IOC_BY_AUTO {ผู้ใช้ส่วนตัวผู้ใช้;/** ตรวจสอบว่าการฉีดนั้นสำเร็จ*/บูลีนสาธารณะตรวจสอบ () {ถ้า (ผู้ใช้ == null) {ส่งคืน false; user.getPassword ());} system.out.println ("ถูกต้อง !!!"); return true;}/** แอ็กชั่นแอสเซมบลีอัตโนมัติต้องการการตั้งค่าวิธีการตั้งค่า*/public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}}}}}}}}การกำหนดค่า ApplicationContext.xml
<!-ถั่วที่ได้รับจากแอสเซมบลีอัตโนมัติ-> <bean id = "ผู้ใช้"> <property name = "id" value = "1"/> <ชื่อคุณสมบัติ = "ชื่อผู้ใช้" value = "Auto-Assembly"/> <property name = "Password" Value = "233"/> ประเภทคุณสมบัติของคลาส หากการจับคู่ถั่วหลายตัวจับตัวสร้างข้อยกเว้นตรงกับถั่วที่สอดคล้องกันตามประเภทพารามิเตอร์คอนสตรัคเตอร์ของคลาส ไม่เริ่มต้นหมายความว่าไม่ได้ใช้ค่าเริ่มต้นของแอสเซมบลีอัตโนมัติ: กำหนดโดยคุณสมบัติเริ่มต้นอัตโนมัติของฉลากด้านบน <Bean>-> <bean id = "ioc_by_auto" autoWire = "byname"> </eac
รหัสทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationcontext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_auto"); ioc.checkattr ();}}ผลลัพธ์ของคอนโซล
ผู้ใช้: 1 | แอสเซมบลีอัตโนมัติ | 233 ถูกต้อง! - -
ข้างต้นใช้โหมด byname รหัสการกำหนดค่าของโหมดอื่น ๆ ได้รับการระบุและไม่มีการทดสอบ
4. แอตทริบิวต์การฉีดโดยใช้ p namespace
รหัสชั้นเรียนทดสอบ
/** การฉีดโดยใช้ p namespace*/คลาสสาธารณะ IOC_BY_P {ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัว; ผู้ใช้ส่วนตัวผู้ใช้;/** ตรวจสอบว่าการฉีดนั้นสำเร็จ*/บูลีนสาธารณะตรวจสอบ () {ถ้า (id == null) {return false; id);} system.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ชื่อ);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - id) {this.id = id;} โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name;} public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}}การกำหนดค่า ApplicationContext.xml
<!-ฉีดคุณสมบัติประเภทต่าง ๆ โดยใช้ p namespace-> <bean id = "user2"> <property name = "id" value = "1"/> <property name = "ชื่อผู้ใช้" value = "p"/> <property name = "รหัสผ่าน" value = "233"/> P: user-ref = "user2"> </ebean>
รหัสทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_p"); ioc.checkattr ();}}ผลลัพธ์ของคอนโซล
ID: 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -
5. การฉีดโดยใช้วิธีการอธิบายประกอบ
ฤดูใบไม้ผลิได้ให้การฉีดที่ใช้คำอธิบายประกอบหลังจาก 3.0
1.@AutoWired-Annotation ของตัวแปรสมาชิกวิธีการและตัวสร้างเพื่อให้งานแอสเซมบลีอัตโนมัติเสร็จสมบูรณ์ ไม่แนะนำให้ใช้
2. @Qualifier-combined กับ @autowired เพื่อแก้ปัญหาการประกอบถั่วหลายชนิดในประเภทเดียวกัน
3. @Resource-JSR-250 คำอธิบายประกอบมาตรฐานฟังก์ชั่นเทียบเท่ากับ @autowired แต่ @autowired ถูกฉีดโดยอัตโนมัติตาม Bytype ในขณะที่ @Resource ถูกฉีดโดยอัตโนมัติตามชื่อโดยค่าเริ่มต้น
4. @postconstruct - เพิ่มคำอธิบายประกอบ @postConstruct ไปยังวิธีการและวิธีนี้จะถูกดำเนินการโดยคอนเทนเนอร์สปริงหลังจากเริ่มต้นถั่ว
5. @คำอธิบายประกอบ Predestroy-ADD @Predestroy บนวิธีนี้วิธีนี้จะถูกดำเนินการโดยคอนเทนเนอร์สปริงหลังจากเริ่มต้นถั่ว
6. @Component-only เพิ่มคำอธิบายประกอบ @component ลงในคลาสที่สอดคล้องกันคลาสจะถูกกำหนดเป็นถั่ว ไม่แนะนำให้ใช้ ขอแนะนำให้ใช้สามประเภทที่ละเอียดยิ่งขึ้น: @repository, @Service, @Controller
@repository storage layer bean
@Service Business Layer Bean
@Controller Layer Layer Bean
7.@ขอบเขตกำหนดขอบเขตของถั่ว
ก่อนกำหนด applicationcontext.xml เพื่อเปิดใช้งานคำอธิบายประกอบ
<!-สแกนคลาส Annotated ในแพ็คเกจ-> <บริบท: Component-Scan base-package = "com.bc.ioc.demo05"/>
คำอธิบายประกอบของถั่ว
@RepositoryPublic คลาสผู้ใช้ {Private Integer ID = 1; String Private String username = "Annotation Injection"; รหัสผ่านสตริงส่วนตัว = "233"; ผู้ใช้สาธารณะ () {super ();} ผู้ใช้สาธารณะ (จำนวนเต็ม id, ชื่อผู้ใช้สตริง, {super (); String getUserName () {return username;} public String getPassword () {return password;} public void setId (Integer id) {this.id = id;} โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.username = username;คำอธิบายประกอบรหัสคลาส
/** แอตทริบิวต์การฉีดโดยใช้คำอธิบายประกอบ*/@service ("IOC_BY_ANNOTATION") คลาสสาธารณะ IOC_BY_ANNOTATION {@Resource ผู้ใช้ส่วนตัวผู้ใช้ Void SetUser สาธารณะ (ผู้ใช้ผู้ใช้) {this.user = ผู้ใช้;}/** ตรวจสอบว่าการฉีดนั้นประสบความสำเร็จ {system.out.println ("ผู้ใช้:" + user.getId () + "|" + user.getUserName () + "|" + user.getPassword ());} system.out.println ("ถูกต้อง !!!"); ส่งคืนจริง;รหัสทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_annotation"); ioc.checkattr ();}}เอาต์พุตคอนโซล
หลังจากการทดสอบใช้การฉีดคำอธิบายประกอบ หาก ApplicationContext.xml ได้รับการกำหนดค่าด้วยวิธีการฉีดอื่น ๆ จะมีการรายงานข้อผิดพลาดซึ่งจะทำให้วิธีการฉีดอื่น ๆ ผิดปกติ
ผู้ใช้: 1 | การฉีดคำอธิบายประกอบ | 233 ถูกต้อง! - -
6. การฉีดถั่วโดยการกำหนดค่าวิธีการคงที่โรงงาน
รหัสโรงงาน
/** โรงงานคงที่*/คลาสสาธารณะ StaticFactory {Public Static Integer getId () {return 1;} สตริงคงที่สาธารณะ getName () {return "โรงงานคงรหัสชั้นเรียนทดสอบ
/** การฉีดผ่านโรงงานคงที่*/คลาสสาธารณะ IOC_BY_STATICFACTORY {ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัวผู้ใช้ส่วนตัวผู้ใช้;/** ตรวจสอบว่าการฉีดนั้นประสบความสำเร็จหรือไม่ id);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ชื่อ);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - id) {this.id = id;} โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name;} public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}}การกำหนดค่า ApplicationContext.xml
<!-การกำหนดค่าวิธีการแบบคงที่จากโรงงานถั่วคือการกำหนดค่าค่าที่ส่งคืนโดยวิธีโรงงานเป็นถั่ว-> <ถั่ว id = "Factory_id" โรงงาน-วิธี = "getId"/> <ถั่ว id = "factory_name" factory-method = "getName"/> id = "ioc_by_staticfactory"> <property name = "id" ref = "factory_id"/> <ชื่อคุณสมบัติ = "ชื่อ" ref = "Factory_name"/> <ชื่อคุณสมบัติ = "ผู้ใช้" ref = "Factory_user"/> </ebean>
รหัสทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_staticfactory"); ioc.checkattr ();}}ผลลัพธ์ของเอาต์พุตคอนโซล
ID: 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -
7. การฉีดผ่านตัวอย่างโรงงานตัวอย่าง
ความแตกต่างจากโรงงานคงที่คือโรงงานอินสแตนซ์ไม่คงที่ คุณต้องใช้วัตถุโรงงานอินสแตนซ์ใหม่แรกก่อนที่คุณจะสามารถกำหนดค่าวิธีการของมัน วัตถุใหม่ได้รับการจัดการโดยฤดูใบไม้ผลิ
รหัสโรงงาน
/** อินสแตนซ์โรงงาน*/โรงงานคลาสสาธารณะ {สาธารณะจำนวนเต็ม getId () {return 1;} สตริงสาธารณะ getName () {return "อินสแตนซ์โรงงาน";} ผู้ใช้สาธารณะ getUser () {ส่งคืนผู้ใช้ใหม่ (1, "ผู้ใช้โรงงานอินสแตนซ์", "233");}}}}}รหัสชั้นเรียนทดสอบ
/** อินสแตนซ์การฉีดจากโรงงาน*/คลาสสาธารณะ IOC_BY_FACTORY {ID จำนวนเต็มส่วนตัว; ชื่อสตริงส่วนตัวผู้ใช้ส่วนตัวผู้ใช้;/** ตรวจสอบว่าการฉีดนั้นสำเร็จ*/บูลีนสาธารณะตรวจสอบ () {ถ้า (id == null) {return false; id);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ชื่อ);} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - id) {this.id = id;} โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name;} public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}}การกำหนดค่า ApplicationContext.xml
<!-กำหนดค่าอินสแตนซ์โรงงานถั่ว-> <bean id = "โรงงาน"/> <!-กำหนดค่าวิธีการของโรงงานอินสแตนซ์ถั่ว-> <bean id = "f_id" Factory-bean = "โรงงาน" โรงงาน-เมทอรี่ = "getid => <bean id =" f_name Factory-bean = "โรงงาน" โรงงาน-วิธี = "getUser"/> <!-ฉีดเมธอดโรงงานอินสแตนซ์ที่สอดคล้องกัน-> <bean id = "ioc_by_factory"> <ชื่อคุณสมบัติ = "id" ref = "f_id"/> <property name = "name" ref = "f_name"/> <
รหัสชั้นเรียนทดสอบ
คลาสสาธารณะ IOC_Test {Private ApplicationContext CTX; @Before Public Public Void Load () {// อ่าน ApplicationContext.xml ไฟล์การกำหนดค่า ctx = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml");}@ทดสอบโมฆะสาธารณะ ctx.getBean ("ioc_by_factory"); ioc.checkattr ();}}เอาต์พุตคอนโซล
ID: 1 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -
สรุป
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ที่หารือเกี่ยวกับวิธีการฉีดของสปริง IOC และฉีดชนิดข้อมูลที่แตกต่างกัน ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!