1. หมายเหตุ
คำอธิบายประกอบเป็นกลไกที่คล้ายกับคำอธิบายประกอบ การเพิ่มคำอธิบายประกอบในรหัสสามารถใช้ข้อมูลนี้ได้ในภายหลัง ความคิดเห็นที่แตกต่างจากความคิดเห็นเพื่อให้เราเห็น เครื่องเสมือน Java ไม่สามารถรวบรวมได้และคำอธิบายประกอบไม่ได้รวบรวม แต่เราสามารถอ่านข้อมูลในคำอธิบายประกอบผ่านกลไกการสะท้อนกลับ คำอธิบายประกอบใช้คำหลัก @Interface สืบทอด java.lang.annotition.annotation
1. คำอธิบายประกอบใน Javase
ให้ฉันยกตัวอย่างให้คุณตรวจสอบคำอธิบายประกอบที่อยู่ใน Javase กุญแจสำคัญคือสองจุด: คำจำกัดความของคำอธิบายประกอบและวิธีการรับข้อมูลข้างต้นคำอธิบายประกอบผ่านการสะท้อน
1. ก่อนกำหนดสองคำอธิบายประกอบ หนึ่งคือคำอธิบายประกอบ classInfo ในชั้นเรียนและอื่น ๆ เป็นวิธีการอธิบายประกอบในวิธีการ
ชั้นเรียน
แพ็คเกจ com.itheima10.annotation; นำเข้า java.lang.annotation.documented; นำเข้า java.lang.annotation.elementType; นำเข้า java.lang.annotation.retention; นำเข้า java.lang.annotation.retentionpolicy; คำอธิบายประกอบสามารถใช้ในชั้นเรียน @retention (RetentionPolicy.runtime) // ใน java ไฟล์คลาสและคำอธิบายประกอบรันไทม์ @Documented // สามารถสร้างขึ้นได้ในเอกสารช่วยเหลือสาธารณะ @Interface classInfo { /** * คำอธิบายประกอบนี้มีคุณสมบัติสองประเภทของสตริง ค่าสตริง () ค่าเริ่มต้น "";}วิธีการ
แพ็คเกจ com.itheima10.annotation; นำเข้า java.lang.annotation.documented; นำเข้า java.lang.annotation.elementtype; นำเข้า java.lang.annotation.Retention; นำเข้า java.lang.annotation.retentionpolicy; คำอธิบายประกอบสามารถใช้กับวิธีการ @retention (RetentionPolicy.runtime) // ใน java ไฟล์คลาสและคำอธิบายประกอบรันไทม์ @Documented // สามารถสร้างขึ้นได้ในเอกสารช่วยเหลือ public @Interface MethodInfo { /*** คำอธิบายประกอบนี้มีคุณสมบัติสองประเภทของสตริง* /สตริง ค่าสตริง () ค่าเริ่มต้น "";}2. เขียนคลาส Annotationuse เพื่อใช้คำอธิบายประกอบที่กำหนดไว้ข้างต้น
แพ็คเกจ com.itheima10.annotation; @classinfo (name = "xiaopingguo118", value = "niu") คำอธิบายประกอบชั้นเรียนสาธารณะ
3. เขียนคำอธิบายประกอบคลาสทดสอบและแยกวิเคราะห์คุณสมบัติเหนือคำอธิบายประกอบทั้งสอง
แพ็คเกจ com.itheima10.annotation; นำเข้า java.lang.reflect.method; นำเข้า org.junit.test; คำอธิบายประกอบชั้นเรียนสาธารณะ // ตัดสินว่ามีคำอธิบายประกอบ classInfo ในชั้นเรียนหรือไม่ถ้า (class1.isannotationpresent (classinfo.class)) {// รับคำอธิบายประกอบใน classclassinfo classinfo = (classInfo) class1.getannotation (classinfo.class); System.out.println (classinfo.value ()); System.out.println (classinfo.name ()); } วิธีการ [] methods = class1.getMethods (); สำหรับ (วิธีการ: วิธีการ) {// มีคำอธิบายประกอบ MethodInfo เกี่ยวกับวิธีการที่ถูกสำรวจหาก (method.isannotationpresent (methodInfo.class)) {methodInfo methodInfo = method.getAnnotation (methodInfo.class); System.out.println (MethodInfo.name ()); System.out.println (MethodInfo.value ()); }}} @Test Public Void Test () {AnnotationTest.test (); -2. คำอธิบายประกอบในฤดูใบไม้ผลิ
Framework Spring ให้ฟังก์ชั่นคำอธิบายประกอบ
การใช้การเขียนโปรแกรมคำอธิบายประกอบเป็นหลักเพื่อแทนที่ไฟล์ XML และทำให้การพัฒนาเร็วขึ้น อย่างไรก็ตามการใช้ไฟล์ XML คือการแก้ปัญหาการแก้ไขซอร์สโค้ดของโปรแกรม ตอนนี้ฉันไม่ได้ใช้ไฟล์ XML แล้วมันจะไม่เป็นการละเมิดหลักการของการเปิดและปิดหรือไม่? เป็นเรื่องจริง อย่างไรก็ตามคำอธิบายประกอบก็ดีเช่นกันดังนั้นคุณไม่จำเป็นต้องกำหนดค่าไฟล์ XML จำนวนมากเมื่อใช้คำอธิบายประกอบ สิ่งที่สำคัญที่สุดคือพวกเขามีประสิทธิภาพการพัฒนาสูง -
เมื่อไม่มีการใช้คำอธิบายประกอบต้องกำหนดค่าแท็ก <Bean> จำนวนมากในไฟล์ configuration file ApplicationContext.xml ของเฟรมเวิร์กสปริงเพื่อประกาศวัตถุคลาส การใช้คำอธิบายประกอบคุณไม่จำเป็นต้องเพิ่มแท็กดึงในไฟล์การกำหนดค่าและคำอธิบายที่เกี่ยวข้องคือการเพิ่มคำแนะนำในตำแหน่ง "ความคิดเห็น" ของคลาสที่เกี่ยวข้อง การแนะนำเฉพาะมีดังนี้:
• 1. การรวมกันของความสัมพันธ์ระหว่างวัตถุ @Resource ค่าเริ่มต้นคือการรวมตัวกันตามชื่อ หากไม่พบวัตถุที่เกี่ยวข้องตามชื่อการค้นหาตามประเภทจะดำเนินการต่อ หากไม่มีการระบุแอตทริบิวต์ชื่อ
•เมื่อมีการทำเครื่องหมายคำอธิบายประกอบบนฟิลด์ค่าเริ่มต้นคือการใช้ชื่อของฟิลด์เป็นชื่อถั่วเพื่อค้นหาวัตถุการพึ่งพา
•เมื่อคำอธิบายประกอบถูกทำเครื่องหมายบนวิธีการตั้งค่าของแอตทริบิวต์ชื่อแอตทริบิวต์เริ่มต้นจะถูกใช้เป็นชื่อถั่วเพื่อค้นหาวัตถุการพึ่งพา
•หมายเหตุ: หากไม่ได้ระบุแอตทริบิวต์ชื่อและไม่สามารถระบุวัตถุการพึ่งพาได้โดยค่าเริ่มต้นคำอธิบายประกอบ @Resource จะกลับไปที่แอสเซมบลีตามประเภท แต่เมื่อระบุแอตทริบิวต์ชื่อแล้วมันจะสามารถประกอบได้ด้วยชื่อเท่านั้น
• 2. @autowired
@autowired ถูกรวบรวมโดยพิมพ์ตามค่าเริ่มต้น @Resource จะถูกรวบรวมตามชื่อตามค่าเริ่มต้นและเฉพาะเมื่อพบว่าถั่วจับคู่ชื่อไม่พบจะถูกรวมเข้าด้วยกันตามประเภท วิธีแก้ปัญหาคือการรวบรวมวัตถุที่ต้องพึ่งพาตามประเภท โดยค่าเริ่มต้นจะต้องมีวัตถุขึ้นอยู่กับที่มีอยู่ หากได้รับอนุญาตให้ค่า NULL สามารถตั้งค่าเป็นเท็จได้
• 3. @qualifier
หากเราต้องการใช้แอสเซมบลีตามชื่อเราสามารถใช้ร่วมกับคำอธิบายประกอบ @qualifier
1. ในการใช้คำอธิบายประกอบคุณจะต้องเพิ่มเนมสเปซและขั้นตอนไฟล์ข้อ จำกัด ในไฟล์การกำหนดค่า:
แนะนำ namespace บริบท
<ถั่ว xmlns = "http://www.springframework.org/schema/beans"
xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance"
xmlns: context = "http://www.springframework.org/schema/context"
-
http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
2. เพิ่มบริบท: แท็กคำอธิบายประกอบ-config ไปยังไฟล์การกำหนดค่า
<บริบท: Annotation-config> </บริบท: Annotation-config>
ตัวอย่างการสาธิต:
เขียนชั้นเรียนบุคคลด้วยคุณลักษณะของนักเรียนและวิธีการพูด () รหัสมีดังนี้
แพ็คเกจ com.itheima10.spring.di.annotation; นำเข้า Javax.annotation.resource; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.beans.factory.annotation.qualifier; พิมพ์ @qualifier ("นักเรียน") * */บุคคลชั้นเรียนสาธารณะ {@Resource (name = "นักเรียน") นักเรียนเอกชน โมฆะสาธารณะบอกว่า () {this.student.say (); -รหัสชั้นเรียนของนักเรียนมีดังนี้
แพ็คเกจ com.itheima10.spring.di.annotation; นักเรียนชั้นเรียนสาธารณะ {โมฆะสาธารณะพูด () {system.out.println ("นักเรียน"); -กำหนดค่าไฟล์ ApplicationContext.xml
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: context = "http://www.springframework xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context เข้าสู่คอนเทนเนอร์ฤดูใบไม้ผลิ-> <bean id = "person"> </epean> <bean id = "นักเรียน"> </epean> <!-แนะนำบริบท namespace xmlns: บริบท = "http://www.springframework.org/schema/conetext http://www.springframework.org/schema/context/spring-context-2.5.xsd "-> <!-ตัวแยกวิเคราะห์คำอธิบายประกอบที่ได้รับการฉีดตั้งแต่เริ่มต้น-> <บริบท: คำอธิบายประกอบ:
เขียนคำอธิบายประกอบคลาสทดสอบ
แพ็คเกจ com.itheima10.spring.di.annotation; นำเข้า org.junit.test; นำเข้า org.springframework.context.applicationContext; นำเข้า org.springframework.context.support.classpathxmlapplication แยกวิเคราะห์ถึง* <บริบท: คำอธิบายประกอบ-config> </บริบท: คำอธิบายประกอบ-config>*, ตัวแยกวิเคราะห์คำอธิบายประกอบสำหรับการฉีดพึ่งพาการพึ่งพาจะเริ่มขึ้น* 4 คอนเทนเนอร์สปริงจะค้นหาภายในขอบเขตของถั่วที่รวมอยู่ในการจัดการสปริง แอตทริบิวต์ของคำอธิบายประกอบคือ "" * ถ้าเป็น "" มันจะตรงกับชื่อของแอตทริบิวต์ที่มีคำอธิบายประกอบอยู่และค่าของ ID ในคอนเทนเนอร์ฤดูใบไม้ผลิ หากการแข่งขันสำเร็จการมอบหมาย * หากการแข่งขันไม่สำเร็จการมอบหมายจะดำเนินการตามประเภท หากการแข่งขันสำเร็จการมอบหมายจะได้รับมอบหมาย * หากการแข่งขันไม่สำเร็จการมอบหมายจะได้รับการรายงาน * หากการแข่งขันไม่สำเร็จการมอบหมายจะถูกรายงานโดยตรง * หากการแข่งขันไม่สำเร็จ เปรียบเทียบประเภทการอ้างอิง XML และคำอธิบายประกอบ ประสิทธิภาพค่อนข้างสูง การเขียนมีปัญหามากขึ้น การเขียนคำอธิบายประกอบนั้นค่อนข้างง่ายและมีประสิทธิภาพน้อยกว่า * */AnnotationTest คลาสสาธารณะ {@Test Public Public Void Testannotation () {applicationContext context = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); บุคคล = (บุคคล) บริบท getBean ("บุคคล"); Person.Say (); -หากคุณใช้คำอธิบายประกอบคุณไม่จำเป็นต้องโหลดบุคคลและนักเรียนในไฟล์กำหนดค่าซึ่งสามารถทำให้การเขียนไฟล์กำหนดค่าง่ายขึ้น
3. สแกน
ในตัวอย่างก่อนหน้านี้เราใช้นิยามถั่ว XML เพื่อกำหนดค่าส่วนประกอบ ในโครงการที่ใหญ่กว่าเล็กน้อยมักจะมีส่วนประกอบหลายร้อยรายการ หากส่วนประกอบเหล่านี้ได้รับการกำหนดค่าโดยใช้นิยาม XML Bean มันจะเพิ่มขนาดของไฟล์การกำหนดค่าอย่างเห็นได้ชัดทำให้ไม่สะดวกในการค้นหาและบำรุงรักษา Spring2.5 แนะนำกลไกการสแกนส่วนประกอบอัตโนมัติสำหรับเราซึ่งสามารถค้นหาคลาสที่มีคำอธิบายประกอบด้วย @component, @Service, @Controller และ @Repository Annotations ภายใต้ ClassPath และรวมคลาสเหล่านี้ไว้ในคอนเทนเนอร์ฤดูใบไม้ผลิเพื่อจัดการ ฟังก์ชั่นของมันเหมือนกับการใช้ส่วนประกอบการกำหนดค่าโหนดถั่วในไฟล์ XML ในการใช้กลไกการสแกนอัตโนมัติเราจำเป็นต้องเปิดข้อมูลการกำหนดค่าต่อไปนี้:
1. แนะนำ namespace บริบท
เพิ่มบริบท: แท็กคอมโพเนนต์-สแกนในไฟล์การกำหนดค่า XML
โดยที่ฐานแพคเกจคือแพ็คเกจ (แพคเกจย่อย) ที่ต้องสแกน
ตัวอย่าง:
ตัวอย่างข้างต้นเขียนในโหมดสแกนดังนี้
@ComponentPublic คนชั้นเรียน {@Resource (name = "นักเรียน") นักเรียนนักเรียนเอกชน; โมฆะสาธารณะบอกว่า () {this.student.say (); }}@ComponentPublic คลาสนักเรียน {โมฆะสาธารณะพูด () {system.out.println ("นักเรียน"); -ApplicationContext.xml จะต้องกำหนดค่าในประโยคเดียวเท่านั้น
<!-องค์ประกอบส่วนประกอบวางคลาสลงในคอนเทนเนอร์สปริงและคลาสเรียกว่าการสแกนส่วนประกอบภายใต้แพ็คเกจและแพคเกจย่อยที่ระบุโดยฐานแพคเกจ-> <บริบท: ส่วนประกอบ-สแกนฐานแพคเกจ = "com.itheima10.spring.scan"> </บริบท: คอมโพเนนต์
เขียนคำอธิบายประกอบคลาสทดสอบ
/*** หลักการ* 1. เริ่มต้นสปริงคอนเทนเนอร์* 2. สปริงคอนเทนเนอร์การแยกวิเคราะห์* <บริบท: คอมโพเนนต์-สแกนฐานแพคเกจ = "com.itheima10.spring.scan"> </บริบท: ส่วนประกอบ-สแกน> 3. สแกนในแพ็คเกจ == เทียบเท่ากับ <bean id = "person"> @component ("aa") บุคคลระดับสาธารณะ {} == เทียบเท่ากับ <bean id = "aa"> 5. ทำตามขั้นตอนการวิเคราะห์ของ @Resource: การใช้งานที่ง่ายขึ้น = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); บุคคล = (บุคคล) บริบท getBean ("บุคคล"); Person.Say (); -อีกครั้งของอินสแตนซ์
เราจะเปลี่ยนระบบการจัดการเอกสารล่าสุดในรายการ 51 ในคำอธิบายประกอบ อินเทอร์เฟซเอกสารยังคงไม่เปลี่ยนแปลงด้วยวิธีการอ่านและเขียน คลาสการใช้งานมีดังนี้ ExcelDocument, PdfDocument และ WordDocument
@Component ("ExcelDocument") คลาสสาธารณะ ExcelDocument ใช้เอกสาร {โมฆะสาธารณะอ่าน () {System.out.println ("Excel Read"); } โมฆะสาธารณะเขียน () {system.out.println ("Excel Write"); }}@Component ("pdfDocument") คลาสสาธารณะ PdfDocument ใช้เอกสาร {โมฆะสาธารณะอ่าน () {system.out.println ("pdf read"); } โมฆะสาธารณะเขียน () {system.out.println ("pdf write"); }}@Component ("WordDocument") คลาสสาธารณะ WordDocument ใช้เอกสาร {โมฆะสาธารณะอ่าน () {system.out.println ("อ่านคำ"); } โมฆะสาธารณะเขียน () {System.out.println ("Word Write"); -DocumentManager
@Component ("DocumentManager") คลาสสาธารณะ DocumentManager {@Resource (name = "excelDocument") เอกสารส่วนตัว; โมฆะสาธารณะอ่าน () {this.document.read (); } โมฆะสาธารณะเขียน () {this.document.write (); -ไฟล์กำหนดค่า
<บริบท: Component-Scan base-package = "com.itheima10.spring.iocdi.document">
</บริบท: Component-Scan>
เขียน Documenttest คลาสทดสอบ
Public Class DocumentTest {@Test Public Void TestDocument () {ApplicationContext Context = ใหม่ classPathxMlApplicationContext ("ApplicationContext.xml"); DocumentManager DocumentManager = (DocumentManager) Context.getBean ("DocumentManager"); DocumentManager.read (); DocumentManager.write (); - 2. บทนำเกี่ยวกับฟังก์ชั่นคำอธิบายประกอบอื่น ๆ
@Service ใช้ในการใส่คำอธิบายประกอบส่วนประกอบเลเยอร์ธุรกิจและคำอธิบายประกอบชั้นบริการ
@Controller ใช้เพื่อเพิ่มความหลากหลายส่วนประกอบเลเยอร์การควบคุม (เช่นการกระทำใน struts) และคำอธิบายประกอบเลเยอร์ควบคุม
@Repository ใช้ในการเพิ่มความคิดเห็นส่วนประกอบการเข้าถึงข้อมูลเช่นส่วนประกอบ DAO คำอธิบายประกอบการคงอยู่ของเลเยอร์
@component หมายถึงส่วนประกอบ เมื่อส่วนประกอบไม่ใช่เรื่องง่ายที่จะจำแนกเราสามารถใช้คำอธิบายประกอบนี้เพื่อเพิ่มความคิดเห็น
ตัวอย่างซ้ำกรณี MVC
เราตรวจสอบกรณี MVC ในรายการ 51 อีกครั้งเพิ่ม DAO, Service และเลเยอร์การกระทำของ Persondaoimpl, Personaction และ PersonserviceImpl ตามลำดับเพื่อเพิ่มคำอธิบายประกอบให้กับ DAO, Service และ Action Layers ของ Persondaoimpl
@Repository ("Persondao") ระดับสาธารณะ Persondaoimpl ใช้ persondao {@Override โมฆะสาธารณะ saveperson () {system.out.println ("บันทึกบุคคล"); }} @Service ("Personservice") Public Class PersonserviceImpl ใช้บริการบุคคล {@Resource (name = "persondao") persondao persondao ส่วนตัว; โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะ saveperson () {this.persondao.saveperson (); }} @คอนโทรลเลอร์ ("บุคคล") บุคคลในชั้นเรียนสาธารณะ {@Resource (name = "Personservice") บุคคลส่วนตัวบริการ; โมฆะสาธารณะ setPersonService (บุคคลบริการบุคคล) {this.personservice = บุคคลบริการ; } โมฆะสาธารณะ saveperson () {this.personservice.saveperson (); -เขียน mvctest ทดสอบ
คลาสสาธารณะ mvctest {@test โมฆะสาธารณะ testmvc () {applicationcontext context = new classPathxMlapplicationContext ("ApplicationContext.xml"); personaction personaction = (personaction) บริบท getBean ("personaction"); personaction.saveperson (); -4. มรดกในฤดูใบไม้ผลิ
ฤดูใบไม้ผลิรองรับการสืบทอดซึ่งสามารถแบ่งออกเป็นมรดกและการสืบทอดแอตทริบิวต์
1. การสืบทอดชั้นเรียน
คุณสมบัติฤดูใบไม้ผลิ:
(1) บทคัดย่อ: หากตั้งค่าเป็นจริงหมายความว่าถั่วที่กำหนดเป็นนามธรรมให้บอกสปริงเพื่อไม่ให้อินสแตนซ์ถั่ว;
คำถาม: ต้องเป็นคลาสนามธรรมหรือไม่? มันอาจเป็นคลาสนามธรรมได้หรือไม่?
(2) ผู้ปกครอง: ระบุฟังก์ชั่นของ ID ของถั่วบนถั่วซึ่งเทียบเท่ากับฟังก์ชั่นของการขยายในคลาส Java;
ฉาก: มีถั่วสามตัว:
<bean id = "bean1" class = "… testbean"> <ชื่อทรัพย์สิน = "sex" value = "male"/> </ebean> <bean id = "Bean2" class = "… testbean"> <property name = "sex" value = "Male"/>
แก้ไข: กำหนดถั่วแม่สปริง
<bean id = "baseBean" class = "... testBean"> <property name = "sex" value = "male"/> </ebean>
กำหนด subbeans
<Bean ID = "Bean1" Parent = "BaseBean"/> สืบทอดคุณสมบัติของ Bean Parent Bean <Bean ID = "Bean2" Parent = "BaseBean"/> <bean id = "Bean3" parent = "baseBean"> เขียนทับคุณสมบัติของ Bean Bean
ถั่วเด็กสามารถสืบทอดคุณสมบัติของถั่วแม่หรือแทนที่คุณสมบัติของถั่วแม่
2. การสืบทอดแอตทริบิวต์
มีคุณลักษณะเดียวกันระหว่างถั่วหลายชนิดและฉากสามารถสกัดได้:
<bean id = "Bean1" class = "... atestbean"> <property name = "sex" value = "male"/> <property name = "task" ref = "task"/> </epean> <bean id = "bean2" class = "... btestbean"
แก้ไข: (1) แยกแอตทริบิวต์สาธารณะ
<bean id = "basesex" abstract = "true"> <property name = "sex" value = "male"/> </ebean>
(2) การดัดแปลงถั่ว
<bean id = "bean1" class = "... atestbean" parent = "basesex"> <property name = "task" ref = "task"/> </ebean> <bean id = "bean2" class = "btestbean
ที่นี่ถั่วมีทั้งคุณลักษณะของผู้ปกครองและชั้นเรียนและ basesex ชี้ไปที่ผู้ปกครองคือการอนุญาตให้ถั่วที่แตกต่างกันแบ่งปันค่าแอตทริบิวต์เดียวกัน; เมื่อ TransactionProxyFactoryBean ประกาศบริการการสืบทอดของแอตทริบิวต์ถั่วสามารถลดการกำหนดค่า XML ซ้ำซ้อนได้อย่างมีนัยสำคัญ
การสืบทอดตามคำอธิบายประกอบไม่จำเป็นต้องใช้คุณสมบัติหลัก
มามีภาพสรุปเล็ก ๆ กันเถอะ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น