TL; DR
คำอธิบายประกอบ @Autowired สำรองอะไหล่คุณจำเป็นต้องทำการเดินสายด้วยตัวเองในไฟล์ XML (หรือวิธีอื่น ๆ ) และเพียงแค่หาสิ่งที่คุณจำเป็นต้องฉีดที่ไหนและทำเพื่อคุณ
คำอธิบายแบบเต็ม
@Autowired
บันทึกย่อช่วยให้คุณสามารถข้ามการกำหนดค่าอื่น ๆ ของสิ่งที่จะฉีดและเพียงแค่ไม่ได้สำหรับคุณ สมมติว่าแพ็คเกจของคุณคือcom.mycompany.movies
คุณต้องใส่แท็กนี้ลงใน XML (ไฟล์บริบทของแอปพลิเคชัน):
<context:component-scan base-package="com.mycompany.movies" />
แท็กนี้จะทำการสแกนอัตโนมัติ สมมติว่าแต่ละคลาสที่ต้องกลายเป็นถั่วนั้นมีหมายเหตุประกอบที่ถูกต้องเช่น@Component
(สำหรับถั่วอย่างง่าย) หรือ@Controller
(สำหรับการควบคุม servlet) หรือ@Repository
(สำหรับDAO
คลาส) และคลาสเหล่านี้อยู่ที่ไหนสักแห่งภายใต้แพ็คเกจcom.mycompany.movies
สปริงจะค้นหาสิ่งเหล่านี้ทั้งหมดและสร้าง ถั่วสำหรับแต่ละคน สิ่งนี้ทำในการสแกน 2 ครั้งของคลาส - ครั้งแรกที่มันแค่ค้นหาคลาสที่ต้องกลายเป็น bean และแมปการฉีดที่ต้องทำและในการสแกนครั้งที่สองมันจะอัดถั่ว แน่นอนคุณสามารถกำหนด beans ของคุณในไฟล์ XML แบบดั้งเดิมหรือด้วยคลาส@Configuration (หรือการรวมกันของทั้งสาม)
@Autowired
คำอธิบายประกอบบอกว่าฤดูใบไม้ผลิที่ฉีดความต้องการที่จะเกิดขึ้น หากคุณใส่วิธีการsetMovieFinder
นั้นจะเข้าใจ (โดยคำนำหน้าset
+ @Autowired
คำอธิบายประกอบ) ที่ถั่วจะต้องถูกฉีด ในการสแกนครั้งที่สอง Spring จะค้นหาถั่วชนิดหนึ่งMovieFinder
และหากพบถั่วชนิดนั้นมันจะฉีดลงในวิธีนี้ Exception
หากพบสองถั่วเช่นคุณจะได้รับ เพื่อหลีกเลี่ยงการException
คุณสามารถใช้@Qualifier
คำอธิบายประกอบและบอกว่าถั่วใดในสองเม็ดที่จะฉีดด้วยวิธีต่อไปนี้:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
หรือถ้าคุณต้องการประกาศ beans ใน XML ของคุณก็จะมีลักษณะดังนี้:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
ในการ@Autowired
ประกาศคุณจะต้องเพิ่มการ@Qualifier
บอกว่าถั่วสองสีใดที่จะฉีด:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
หากคุณไม่ต้องการใช้คำอธิบายประกอบสองรายการ ( @Autowired
และ@Qualifier
) คุณสามารถใช้@Resource
เพื่อรวมสองสิ่งนี้:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
@Resource
(คุณสามารถอ่านข้อมูลพิเศษบางอย่างเกี่ยวกับมันในความคิดเห็นแรกในคำตอบนี้) อะไหล่คุณใช้สองคำอธิบายประกอบและแทนที่จะคุณจะใช้อย่างใดอย่างหนึ่ง
ฉันจะเพิ่มความคิดเห็นอีกสองรายการ:
- การปฏิบัติที่ดีที่จะใช้
@Inject
แทน@Autowired
เพราะมันไม่ได้เป็นฤดูใบไม้ผลิที่เฉพาะเจาะจงและเป็นส่วนหนึ่งของJSR-330
มาตรฐาน
- การฝึกฝนที่ดีอีกวิธีหนึ่งคือการใส่
@Inject
/ @Autowired
บนตัวสร้างแทนวิธีการ หากคุณวางไว้บนนวกรรมิกคุณสามารถตรวจสอบว่าถั่วที่ถูกฉีดนั้นไม่เป็นโมฆะและล้มเหลวอย่างรวดเร็วเมื่อคุณพยายามเริ่มต้นแอปพลิเคชันและหลีกเลี่ยงการNullPointerException
เมื่อคุณจำเป็นต้องใช้ถั่วจริง
อัปเดต : เพื่อให้ภาพสมบูรณ์ฉันสร้างคำถามใหม่เกี่ยวกับ@Configuration
ชั้นเรียน