ความแตกต่างระหว่างเทียบกับ

1. ภาพรวม

ในบทช่วยสอนนี้เราจะเรียนรู้เกี่ยวกับความแตกต่างระหว่างองค์ประกอบการกำหนดค่า XML หลักสององค์ประกอบของ Spring: และ .

2. คำจำกัดความของถั่ว

อย่างที่เราทราบกันดีว่า Spring มีสองวิธีในการกำหนดถั่วและการอ้างอิงของเรา: การกำหนดค่า XML และคำอธิบายประกอบ Java นอกจากนี้เรายังสามารถจัดหมวดหมู่คำอธิบายประกอบของ Spring ภายใต้สองกลุ่ม ได้แก่ คำอธิบายประกอบการฉีดพึ่งพาและคำอธิบายประกอบแบบถั่ว

ก่อนที่จะใส่คำอธิบายประกอบเราต้องกำหนด bean และการอ้างอิงทั้งหมดของเราด้วยตนเองในไฟล์คอนฟิกูเรชัน XML ตอนนี้ต้องขอบคุณคำอธิบายประกอบของ Spring มันสามารถค้นพบและเชื่อมโยงถั่วและการอ้างอิงทั้งหมดให้เราโดยอัตโนมัติ ดังนั้นอย่างน้อยเราก็สามารถกำจัด XML ที่จำเป็นสำหรับถั่วและการอ้างอิงได้

แต่เราควรจำไว้ว่าคำอธิบายประกอบจะไร้ประโยชน์ถ้าเราเปิดใช้งาน ในการเปิดใช้งานเราสามารถเพิ่มได้ หรือ ที่ด้านบนของไฟล์ XML ของเรา

ในส่วนนี้เราจะดูวิธีการ และ แตกต่างกันในแง่ของวิธีการเปิดใช้งานคำอธิบายประกอบ

3. การเปิดใช้งานคำอธิบายประกอบโดย < context: annotation-config>

คำอธิบายประกอบส่วนใหญ่จะใช้เพื่อเปิดใช้งานคำอธิบายประกอบการฉีดพึ่งพา @Autowired , @Qualifier , @PostConstruct , @PreDestroyและ@Resourceคือบางส่วนของคนที่สามารถแก้ไขได้

ลองทำตัวอย่างง่ายๆเพื่อดูว่า สามารถทำให้การกำหนดค่า XML ง่ายขึ้นสำหรับเรา

ขั้นแรกให้สร้างคลาสที่มีเขตข้อมูลอ้างอิง:

public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}

ตอนนี้เรามากำหนดถั่วของเรา

ก่อนที่จะดำเนินการต่อไปขอชี้ให้เห็นว่าเรายังต้องประกาศถั่วใน XML นั่นเป็นเพราะว่าเปิดใช้งานคำอธิบายประกอบสำหรับถั่วที่ลงทะเบียนไว้แล้วในบริบทแอปพลิเคชันเท่านั้น

ที่สามารถเห็นได้ที่นี่เราข้อเขียนaccountServiceฟิลด์ใช้@Autowired @Autowiredบอก Spring ว่าฟิลด์นี้เป็นการอ้างอิงที่ต้องต่อสายโดยอัตโนมัติโดยใช้ bean ที่ตรงกัน

หากเราไม่ได้ใช้@Autowiredเราจะต้องตั้งค่าการพึ่งพาaccountServiceด้วยตนเอง:

ตอนนี้เราสามารถอ้างถึงถั่วและการอ้างอิงของเราในการทดสอบหน่วย:

@Test public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml"); UserService userService = context.getBean(UserService.class); AccountService accountService = context.getBean(AccountService.class); Assert.assertNotNull(userService); Assert.assertNotNull(accountService); Assert.assertNotNull(userService.getAccountService()); }

อืมมีบางอย่างผิดปกติที่นี่ ดูเหมือนว่า Spring จะไม่ได้เชื่อมต่อกับaccountServiceแม้ว่าเราจะใส่คำอธิบายประกอบโดย@Autowiredก็ตาม ดูเหมือนว่า@Autowiredจะไม่ทำงาน เพื่อแก้ปัญหานี้เราเพียงแค่เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ XML ของเรา:

4. การเปิดใช้งานคำอธิบายประกอบโดย < context: component-scan>

คล้ายกับ , สามารถรับรู้และประมวลผลคำอธิบายประกอบการฉีดพึ่งพาได้เช่นกัน ยิ่งไปกว่านั้น รับรู้คำอธิบายประกอบของ bean ที่ ไม่ได้ตรวจสอบ

โดยพื้นฐานแล้ว ตรวจพบคำอธิบายประกอบโดยการสแกนแพคเกจ หากต้องการทำให้แตกต่างกันจะบอก Spring ว่าต้องสแกนแพ็คเกจใดเพื่อค้นหาถั่วหรือส่วนประกอบที่มีคำอธิบายประกอบ

@Component , @Repository , @Service , @Controller , @RestControllerและ@Configurationมีหลายตัวที่สามารถตรวจจับได้

มาดูกันว่าเราจะทำให้ตัวอย่างก่อนหน้านี้ง่ายขึ้นได้อย่างไร:

@Component public class UserService { @Autowired private AccountService accountService; } 
@Component public class AccountService {}

นี่@Componentเครื่องหมายคำอธิบายประกอบการเรียนของเราเป็นถั่ว ตอนนี้เราสามารถล้างข้อกำหนด bean ทั้งหมดออกจากไฟล์ XML ของเรา และแน่นอนว่าเราต้องเก็บไฟล์ ด้านบนของมัน:

สุดท้ายโปรดทราบว่า Spring จะค้นหาถั่วที่มีคำอธิบายประกอบและการอ้างอิงภายใต้แพ็คเกจที่ระบุโดยแอตทริบิวต์แพ็คเกจฐาน

5. สรุป

ในบทช่วยสอนนี้เราได้พิจารณาถึงความแตกต่างระหว่าง และ .

ตัวอย่างโค้ดเช่นเคยอยู่บน GitHub