1. การฉีดพึ่งพา (DI)
การฉีดพึ่งพานั้นฟังดูลึกซึ้งมาก แต่ในความเป็นจริงมันคือ: กำหนดค่าให้กับแอตทริบิวต์ มีสองวิธีทั้งหมด ครั้งแรกอยู่ในรูปแบบของพารามิเตอร์ตัวสร้างและอีกรูปแบบหนึ่งอยู่ในรูปแบบของวิธีการตั้งค่า
1 การฉีดคอนสตรัคเตอร์
1 ฉีดโดยใช้ตัวสร้าง
วิธีการฉีดโดยใช้ XML
A. ลำดับของพารามิเตอร์
<constructor-arg index = "0"> <value> Zhang San </value> </constructor-Arg>
<constructor-arg index = "1"> <value> 56 </alue> </constructor-Arg>
B. ประเภทของพารามิเตอร์
<constructor-arg type = "java.lang.integer"> <value> 56 </value> </constructor-Arg>
<constructor-arg type = "java.lang.string"> <value> Zhang San </value> </constructor-Arg>
ตัวอย่างเฉพาะ
หากคุณต้องการฉีดพารามิเตอร์ลงในชั้นเรียนบุคคลตอนนี้นักเรียนเป็นชั้นเรียนอื่น
บุคคลชั้นเรียนสาธารณะ {Private String PID; ชื่อสตริงส่วนตัว; นักศึกษาเอกชน บุคคลสาธารณะ (String PID นักเรียน) {this.pid = PID; this.student = นักเรียน; } บุคคลสาธารณะ (สตริง PID, ชื่อสตริง) {this.pid = pid; this.name = ชื่อ; -กำหนดค่า ApplicationContext.xml หากไม่มีการกำหนดค่าพารามิเตอร์จะมีการรายงานข้อผิดพลาดและไม่พบตัวสร้างที่สอดคล้องกัน หากมีการกำหนดค่าพารามิเตอร์ที่สอดคล้องกันควรประกาศตัวสร้างที่สอดคล้องกันในชั้นเรียน
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" ของตัวสร้างในคลาสบุคคลคือเครื่องหมายมุมของพารามิเตอร์ ค่าประเภทของพารามิเตอร์ หากเป็นคุณสมบัติพื้นฐานให้ใช้ ref ที่ได้รับมอบหมายนี้เพื่ออ้างถึงประเภทการกำหนด-> <constructor-Arg index = "0" type = "java.lang.string" value = "aaa"> </constructor-Arg> <constructor-arg index = "1" ref = "นักเรียน"> value = "1"> </property> </ebean> <bean id = "นักเรียน"> </ebean> </epeans>
เขียนคลาสทดสอบ dixmlconstructortest และดำเนินการดีบักเบรกพอยต์ คุณจะพบว่าตามพารามิเตอร์การกำหนดค่าตัวสร้างที่ป้อนคือบุคคล (String PID นักเรียนนักเรียน)
คลาสสาธารณะ dixmlconstructortest {@test โมฆะสาธารณะ test1 () {applicationcontext context = ใหม่ classpathxmlapplicationContext ("applicationcontext.xml"); บุคคล = (บุคคล) บริบท getBean ("บุคคล"); -2 การฉีดโดยใช้วิธีการตั้งค่าคุณสมบัติ
วิธีการฉีดโดยใช้ XML:
A. การฉีดถั่วง่าย ๆ ถั่วง่าย ๆ รวมถึงสองประเภท: ประเภทบรรจุภัณฑ์และสตริง
<bean id = "personservice"> <!-ประเภทพื้นฐานประเภทสตริง-> <property name = "age" value = "20"> </property> <property name = "name" value = "Zhang Wuji"> </porement> </epean>
B. อ้างถั่วอื่น ๆ
<bean id = "person" /> <bean id = "personservice"> <property name = "person" ref = "person" /> </ebean>
1.1 ชุดประกอบรายการประกอบ
<property name = "lists"> <slist> <value> list1 </value> <alde> list2 </alue> <ref bean = "person"/> </list>
1.2 ชุดประกอบชุดประกอบ
<property name = "sets"> <et> <value> list1 </value> <alde> list2 </alue> <ref bean = "person"/> </set> </property>
1.3 แผนที่แอสเซมบลี
<property name = "maps"> <map> <entry key = "01"> <value> MAP01 </value> </entry> <entry key = "02"> <value> MAP02 </value>
ค่าของ <entry> ในแผนที่เหมือนกับของ <list> และ <et Set> ซึ่งสามารถสร้างองค์ประกอบแอตทริบิวต์ที่ถูกต้อง ควรสังเกตว่าค่าคีย์ต้องเป็นสตริง
1.4 คุณสมบัติการประกอบ
<property name = "อุปกรณ์ประกอบฉาก"> <props> <prop key = "01"> prop1 </prop> <prop key = "02"> prop2 </prop> </props> </porepore>
ตัวอย่างเฉพาะ
1. สร้างวัตถุและนักเรียนสองวัตถุ
แพ็คเกจ xgp.spring.demo; นำเข้า java.util.list; นำเข้า java.util.map นำเข้า java.util.properties; นำเข้า java.util.set; บุคคลระดับสาธารณะ {สตริงส่วนตัว PID; ชื่อสตริงส่วนตัว; นักศึกษาเอกชน รายการส่วนตัว ชุดส่วนตัว แผนที่แผนที่ส่วนตัว คุณสมบัติคุณสมบัติส่วนตัว วัตถุส่วนตัว [] วัตถุ; บุคคลสาธารณะ () {system.out.println ("บุคคลใหม่"); } // ละเว้นวิธีการ getter และ setter} แพ็คเกจ xgp.spring.demo; นักเรียนชั้นเรียนสาธารณะ {นักเรียนสาธารณะ () {system.out.println ("นักเรียนใหม่"); } โมฆะสาธารณะบอกว่า () {system.out.println ("นักเรียน"); -กำหนดค่าไฟล์ ApplicationContext.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <! หากคุณสมบัติเป็นประเภทอ้างอิงให้ใช้ REF เพื่อกำหนดค่า-> <bean id = "person" init-method = "init" lazy-init = "true"> <property name = "pid" value = "1"> </คุณสมบัติ> <property name = "name" value = "Wang ermazi"> <value> list2 </value> <ref bean = "Student"/> </คุณสมบัติ> <property name = "sets"> <et> <dange> set1 </value> <value> set2 </value> <ref bean = "student"/> </set> </property> Bean = "Student"/> </entry> </map> </property> <property name = "properties"> <props> <!-ไม่จำเป็นต้องมีประเภทการอ้างอิง-> <prop key = "prop1"> prop1 </prop> <prop key = "prop2"> prop2 </prop> </property> </ebean> <bean id = "Student"> </epean> </ebeans>
เขียนคลาสทดสอบ dixmlsettertest
แพ็คเกจ xgp.spring.test; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplicationcontext; นำเข้า xgp.spring.demo.person; ภาชนะฤดูใบไม้ผลิทำ? (1) เริ่มต้นสปริงคอนเทนเนอร์* (2) สร้างวัตถุสำหรับถั่วสองตัวของบุคคลและนักเรียน* (3) วิเคราะห์แอตทริบิวต์ชื่อของคุณสมบัติประกบวิธี setter แยกวิเคราะห์ค่า* หรืออ้างอิงของคุณสมบัติของคุณสมบัติส่งพารามิเตอร์ไปยังวิธีการตั้งค่าและใช้เทคโนโลยีการสะท้อนกลับเพื่อกำหนดค่าให้กับวัตถุ * (4) แยกวัตถุออกจากคอนเทนเนอร์สปริงและเรียกวิธีการของวัตถุ * 2. ลำดับการดำเนินการของคอนเทนเนอร์สปริงคืออะไร? */ @Test โมฆะสาธารณะ test1 () {applicationContext context = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); บุคคล = (บุคคล) บริบท getBean ("บุคคล"); System.out.println (person.getPid ()); System.out.println (person.getName ()); System.out.println (person.getLists ()); System.out.println (person.getSets ()); System.out.println (person.getMap ()); System.out.println (person.getObjects (). ความยาว); }}/*1 wang wu [list1, list2, xgp.spring.demo.student@76a9b9c] [set1, set2, xgp.spring.demo.student@76a9b9c] ลำดับการดำเนินการของภาชนะบรรจุสปริง
1. การตั้งค่าเริ่มต้นทั้งหมด
2. ตั้งค่านักเรียน (Lazy-init = true)
3. Set Person (Lazy-init = true)
สรุป
มีสองวิธีในการฉีดพารามิเตอร์ ตัวสร้างจำเป็นต้องเขียนคอนสตรัคเตอร์ที่เกี่ยวข้องตัวตั้งค่าจำเป็นต้องสร้างวิธีการตั้งค่าที่สอดคล้องกันและตัวสร้างเริ่มต้นจะถูกเขียนขึ้น
2.5 ความสำคัญของ IOC และ DI
หลังจากเรียนรู้สิ่งเหล่านี้ความหมายของการค้นพบมันคืออะไร? มาเขียนตัวอย่างของระบบการจัดการเอกสารเพื่อแสดงความต้องการ ดูรูปด้านล่าง
1. เขียนอินเทอร์เฟซเอกสาร
เอกสารอินเทอร์เฟซสาธารณะ {โมฆะสาธารณะอ่าน (); โมฆะสาธารณะเขียน ();}2. เขียนคลาสการใช้งาน WordDocument, ExcelDocument, pdfdocument
คลาสสาธารณะ WordDocument ใช้เอกสาร {โมฆะสาธารณะอ่าน () {system.out.println ("คำอ่านคำ"); } โมฆะสาธารณะเขียน () {System.out.println ("Word Write"); -3. เขียนระบบ DocumentManager
DocumentManager ชั้นเรียนสาธารณะ {เอกสารเอกสารส่วนตัว; โมฆะสาธารณะ setDocument (เอกสารเอกสาร) {this.document = เอกสาร; } Public DocumentManager () {} Public DocumentManager (เอกสารเอกสาร) {super (); this.document = เอกสาร; } โมฆะสาธารณะอ่าน () {this.document.read (); } โมฆะสาธารณะเขียน () {this.document.write (); -4. เขียน Documenttest คลาสทดสอบ
/*** การใช้ IOC และ DI คุณสามารถบรรลุการเขียนโปรแกรมที่เน้นอินเทอร์เฟซที่สมบูรณ์** /DocumentTest คลาสสาธารณะ { /*** เอกสารเอกสาร = new WordDocument (); * บรรทัดของรหัสนี้ไม่ได้เป็นโปรแกรมที่เน้นการเชื่อมต่ออย่างสมบูรณ์เนื่องจากคลาสเฉพาะปรากฏขึ้นทางด้านขวาของเครื่องหมายเท่ากัน*/ @Test Public Public Void TestDocument_nospring () {เอกสารเอกสาร = new WordDocument (); DocumentManager DocumentManager = new DocumentManager (เอกสาร); DocumentManager.read (); DocumentManager.write (); } /*** ทางด้านรหัสฉันไม่รู้ว่าใครใช้เอกสาร สิ่งนี้ถูกกำหนดโดยไฟล์การกำหนดค่าสปริง * <bean id = "documentManager"> <!-เอกสารเป็นอินเทอร์เฟซ-> <ชื่อคุณสมบัติ = "เอกสาร"> <!-WordDocument เป็นคลาสการใช้งานที่กำหนดให้กับอินเทอร์เฟซเอกสาร-> <ref bean = "pdfDocument" classpathxmlapplicationContext ("applicationcontext.xml"); DocumentManager DocumentManager = (DocumentManager) Context.getBean ("DocumentManager"); DocumentManager.read (); DocumentManager.write (); -จากด้านบนเราสามารถเห็นความแตกต่างระหว่างการไม่ใช้ฤดูใบไม้ผลิและการใช้สปริง
<!-DocumentManager, WordDocument, ExcelDocument, pdfDocument ถูกใส่ลงในภาชนะฤดูใบไม้ผลิ-> <bean id = "WordDocument"> </epean> <bean id = "excelDocument"> </epean> <bean id = "pdfDocument"> <!-เอกสารเป็นอินเทอร์เฟซ-> <property name = "document"> <!-WordDocument เป็นคลาสการใช้งานที่กำหนดให้กับอินเทอร์เฟซเอกสาร-> <ref bean = "pdfDocument"/> </property> </ebean>
การใช้สปริงจะต้องมีการกำหนดค่าวัตถุ <ref bean = ""> ที่เกี่ยวข้องใน ApplicationContext โดยไม่ต้องให้ความสนใจกับคลาสการใช้งานที่เฉพาะเจาะจงและการใช้การเขียนโปรแกรมที่เน้นอินเทอร์เฟซที่สมบูรณ์ นี่คือเหตุผลที่ฤดูใบไม้ผลิสามารถรวมเข้ากับเครื่องมือมากมาย
2.6 MVC Instance Simulation Structs2
คำอธิบายข้อกำหนด
สร้างไดเรกทอรีโครงการ
การเข้ารหัส:
1. สร้างเลเยอร์ Dao เพื่อสร้างอินเทอร์เฟซ Persondao และใช้คลาส Persondaoimpl
ส่วนต่อประสานสาธารณะ persondao {โมฆะสาธารณะ saveperson ();} คลาสสาธารณะ persondaoimpl ใช้ persondao {@Override โมฆะสาธารณะ saveperson () {system.out.println ("บันทึกบุคคล"); -2. สร้างเลเยอร์บริการอินเทอร์เฟซของบุคคล
Public Interface Personservice {Public Void Saveperson ();} บุคคลชั้นเรียนสาธารณะใช้การใช้งานบุคคล {persondao persondao ส่วนตัว; โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะ saveperson () {this.persondao.saveperson (); -3. สร้างการกระทำคลาสการสร้างบุคคล
บุคคลในชั้นเรียนสาธารณะ {บุคคลที่ให้บริการส่วนตัว; โมฆะสาธารณะ setPersonService (บุคคลบริการบุคคล) {this.personservice = บุคคลบริการ; } โมฆะสาธารณะ saveperson () {this.personservice.saveperson (); -4. กำหนดค่า ApplicationContext.xml
<!-ใส่บริการ, dao, คลาสแอ็คชั่นลงในคอนเทนเนอร์ฤดูใบไม้ผลิ-> <bean id = "persondao"> </ebean> <bean id = "คนบริการ"> <ชื่อทรัพย์สิน = "persondao"> <ref bean = "personsonvice"> </property> </epeons </porement> </ebean>
5. เขียนคลาสทดสอบ TestMVC
คลาสสาธารณะ mvctest {@test โมฆะสาธารณะ testmvc () {applicationcontext context = new classPathxMlapplicationContext ("ApplicationContext.xml"); personaction personaction = (personaction) บริบท getBean ("personaction"); personaction.saveperson (); // save person}}ตัวอย่างข้างต้นแสดงการเขียนโปรแกรมเชิงสปริงที่เน้นอินเทอร์เฟซอย่างชัดเจน เลเยอร์บริการจำเป็นต้องเรียกอินเทอร์เฟซของเลเยอร์ DAO เท่านั้น แต่ไม่จำเป็นต้องให้ความสนใจกับคลาสการใช้งานของเลเยอร์ DAO และการกระทำนั้นจำเป็นต้องเรียกอินเทอร์เฟซของบริการ แต่ไม่จำเป็นต้องให้ความสนใจกับคลาสการใช้งานของบริการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น