ไฟล์กำหนดค่า
ในตัวอย่างก่อนหน้านี้เราใช้นิยามถั่ว XML เพื่อกำหนดค่าส่วนประกอบ ในโครงการที่ใหญ่กว่าเล็กน้อยมักจะมีส่วนประกอบหลายร้อยรายการ หากส่วนประกอบเหล่านี้ได้รับการกำหนดค่าโดยใช้คำจำกัดความ XML Bean มันจะเพิ่มขนาดของไฟล์การกำหนดค่าอย่างชัดเจนทำให้ไม่สะดวกในการค้นหาและบำรุงรักษา
Spring 2.5 แนะนำกลไกการสแกนส่วนประกอบอัตโนมัติสำหรับเรา มันสามารถค้นหาคลาสที่ใส่คำอธิบายประกอบด้วย @component, @Service, @Controller และ @Repository Annotations ภายใต้ classPath และรวมคลาสเหล่านี้ไว้ในคอนเทนเนอร์ฤดูใบไม้ผลิเพื่อจัดการ
ฟังก์ชั่นของมันเหมือนกับการใช้ส่วนประกอบการกำหนดค่าโหนดถั่วในไฟล์ XML ในการใช้กลไกการสแกนอัตโนมัติเราจำเป็นต้องเปิดข้อมูลการกำหนดค่าต่อไปนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "
<context:component-scan base-package="cn.itcast" /> การกำหนดค่าโดยปริยายลงทะเบียนโปรเซสเซอร์หลาย <context:component-scan base-package="cn.itcast" /> ที่แยกวิเคราะห์คำอธิบายประกอบรวมถึง <บริบท: <context:annotation-config/> นอกจากนี้แพคเกจฐานเป็นแพ็คเกจ (แพคเกจย่อย) ที่ต้องสแกน
คำอธิบายประกอบ
@Service ใช้ในการใส่คำอธิบายประกอบส่วนประกอบเลเยอร์ธุรกิจ @Controller ใช้ในการใส่คำอธิบายประกอบส่วนประกอบเลเยอร์ควบคุม (เช่นการกระทำใน struts2) และ @repository ใช้เพื่อเพิ่มความหมายของส่วนประกอบการเข้าถึงข้อมูลนั่นคือส่วนประกอบ DAO @component หมายถึงส่วนประกอบ เมื่อส่วนประกอบไม่ใช่เรื่องง่ายที่จะจำแนกเราสามารถใช้คำอธิบายประกอบนี้เพื่อเพิ่มความคิดเห็น
บทความนี้ขึ้นอยู่กับกรณีของคำอธิบายประกอบ @autowire และชุดประกอบอัตโนมัติ
ก่อนอื่นเราเปลี่ยนไฟล์กำหนดค่าของ Spring เป็น:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "
ตัวอย่าง
จากนั้นใช้ @Service Annotation เพื่อเพิ่มความคิดเห็นของบุคคล
@ServicePublic Class PersonserviceBean ใช้บริการบุคคล {persondao persondao ส่วนตัว; โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะบันทึก () {persondao.add (); -หมายเหตุประกอบคลาส Persondaobean โดยใช้คำอธิบายประกอบ @Repository ดังนี้:
@RepositoryPublic คลาส Persondaobean ใช้ Persondao {@Override โมฆะสาธารณะเพิ่ม () {System.out.println ("ดำเนินการวิธีการเพิ่ม () ใน Persondaobean"); -ในที่สุดเราแก้ไขรหัสของคลาส Springtest เป็น:
Public Class Springtest {@Test Public Void InstanceSpring () {AbstractApplicationContext CTX = ใหม่ classPathxMlApplicationContext ("beans.xml"); บุคคลที่ให้บริการด้านการบริการ = (บุคคลบริการ) ctx.getBean ("บุคคลที่รับใช้"); persondao persondao = (persondao) ctx.getBean ("Persondaobean"); System.out.println (ผู้ให้บริการ); System.out.println (Persondao); ctx.close (); -ทดสอบเมธอดอินสแตนซ์ () และคุณจะเห็นว่าคอนโซล Eclipse พิมพ์:
หากเราต้องการใช้ชื่อที่ระบุเพื่อให้ได้เราสามารถแก้ไขรหัสของคลาสบุคคลที่ให้บริการเป็น:
@Service ("Personservice") บุคคลชั้นเรียนสาธารณะใช้บริการใช้บริการบุคคล {persondao persondao ส่วนตัว; โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะบันทึก () {persondao.add (); -ด้วยวิธีนี้รหัสของคลาส Springtest ควรเปลี่ยนเป็น:
Public Class Springtest {@Test Public Void InstanceSpring () {AbstractApplicationContext CTX = ใหม่ classPathxMlApplicationContext ("beans.xml"); บุคคลที่ให้บริการด้านการบริการ = (บุคคลบริการ) ctx.getBean ("บุคคลบริการ"); System.out.println (ผู้ให้บริการ); ctx.close (); -ทดสอบเมธอดอินสแตนซ์ () และคุณจะเห็นว่าคอนโซล Eclipse พิมพ์:
เราได้เรียนรู้ขอบเขตของถั่วที่มีการจัดการฤดูใบไม้ผลิมาก่อนและเราสามารถรู้ได้ว่าขอบเขตของถั่วที่มีการจัดการฤดูใบไม้ผลิทั้งสองข้างต้นคือซิงเกิลตันโดยค่าเริ่มต้น แน่นอนว่าเราสามารถเปลี่ยนขอบเขตของถั่วที่มีการจัดการในฤดูใบไม้ผลิเช่นการเปลี่ยนรหัสของชั้นเรียนบุคคลที่ให้บริการเป็น:
@Service ("Personservice") @Scope ("Prototype") บุคคลระดับสาธารณะในระดับบุคคลที่ใช้บริการโดยใช้บริการบุคคล {persondao persondao ส่วนตัว; โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะบันทึก () {persondao.add (); -ซึ่งหมายความว่าขอบเขตของบุคคลที่ได้รับการจัดการโดยฤดูใบไม้ผลิได้กลายเป็นต้นแบบ ในเวลานี้เราแก้ไขรหัสของคลาส Springtest เป็น:
Public Class Springtest {@Test Public Void InstanceSpring () {AbstractApplicationContext CTX = ใหม่ classPathxMlApplicationContext ("beans.xml"); บุคคลที่ให้บริการบุคคลที่รับใช้ 1 = (บุคคลที่บริการ) ctx.getBean ("บุคคลบริการ"); บุคคลที่ให้บริการผู้ให้บริการ 2 = (บุคคลที่บริการ) ctx.getBean ("บุคคลบริการ"); System.out.println (Personservice1 == Personservice2); ctx.close (); -ทดสอบเมธอดอินสแตนซ์ () และคุณจะเห็นว่าคอนโซล Eclipse พิมพ์:
ขอบเขตต้นแบบหมายความว่าทุกครั้งที่คุณได้ถั่วจากภาชนะสปริงมันเป็นวัตถุใหม่
หากส่วนประกอบรวมอยู่ในคอนเทนเนอร์สปริงโดยการสแกนโดยอัตโนมัติภายใต้เส้นทาง classpath วิธีการระบุวิธีการเริ่มต้นและวิธีการทำลายของถั่ว? ในเวลานี้เราต้องใช้สองคำอธิบายประกอบ: @postconstruct และ @predestroy สำหรับการทดลองเราได้ปรับเปลี่ยนรหัสบุคคล
@Service ("Personservice") บุคคลชั้นเรียนสาธารณะใช้บริการใช้บริการบุคคล {persondao persondao ส่วนตัว; @PostConstruct โมฆะสาธารณะ init () {system.out.println ("เริ่มต้นทรัพยากร"); } @Predestroy โมฆะสาธารณะทำลาย () {system.out.println ("ทำลายทรัพยากรปิด"); } โมฆะสาธารณะ setpersondao (persondao persondao) {this.persondao = persondao; } @Override โมฆะสาธารณะบันทึก () {persondao.add (); -ต่อไปเราต้องแก้ไขรหัสของคลาส Springtest เป็น:
Public Class Springtest {@Test Public Void InstanceSpring () {AbstractApplicationContext CTX = ใหม่ classPathxMlApplicationContext ("beans.xml"); บุคคลที่ให้บริการด้านการบริการ = (บุคคลบริการ) ctx.getBean ("บุคคลบริการ"); ctx.close (); -ด้วยวิธีนี้ให้ทดสอบเมธอดอินสแตนซ์ () และคอนโซล Eclipse จะพิมพ์:
หากต้องการดูซอร์สโค้ดคลิกเพื่อให้สปริงสแกนและจัดการถั่วเพื่อดาวน์โหลดโดยอัตโนมัติ
สรุป
ข้างต้นเป็นแพ็คเกจสแกนสปริงอัตโนมัติที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!