เนื่องจากคำตอบจำนวนมากระบุว่าใช้คำอธิบายประกอบเหล่านี้แล้วเราจะเน้นที่ความแตกต่างเล็กน้อยระหว่างคำเหล่านี้
ก่อนอื่นความคล้ายคลึงกัน
จุดแรกที่ควรเน้นอีกครั้งคือการสแกนด้วยการตรวจจับอัตโนมัติและการฉีดพึ่งพาสำหรับ BeanDefinitionคำอธิบายประกอบเหล่านี้ทั้งหมด (viz., @Component, @Service, @Repository, @Controller) เหมือนกัน เราสามารถใช้งานแทนกันได้และยังสามารถไปต่อได้
ความแตกต่างระหว่าง @Component, @Repository, @Controller และ @Service
@Component
นี่คือคำอธิบายประกอบแบบแผนตายตัวทั่วไปที่บ่งบอกว่าคลาสเป็นส่วนประกอบสปริง
มีอะไรพิเศษเกี่ยวกับ @Component
<context:component-scan>เพียงสแกน@Componentและไม่ได้มองหา@Controller,@Serviceและ@Repositoryโดยทั่วไป @Componentพวกเขาจะถูกสแกนเพราะพวกเขาเองจะกำกับด้วย
เพียงแค่ใช้เวลาดูที่@Controller, @Serviceและ@Repositoryคำจำกัดความของคำอธิบายประกอบ:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
ดังนั้นก็ไม่ผิดที่จะกล่าวว่า@Controller, @Serviceและ@Repositoryประเภทพิเศษของ@Componentคำอธิบายประกอบ <context:component-scan>เลือกพวกเขาและลงทะเบียนคลาสต่อไปนี้เป็น beans เช่นเดียวกับที่ใส่หมายเหตุประกอบ@Componentไว้
คำอธิบายประกอบแบบพิเศษจะถูกสแกนด้วยเช่นกันเนื่องจากมีการเพิ่มความคิดเห็นด้วย@Componentหมายเหตุประกอบ@Componentเอง หากเรากำหนดคำอธิบายประกอบที่กำหนดเองของเราเองและใส่คำอธิบายประกอบด้วย@Componentก็จะถูกสแกนด้วย<context:component-scan>
@Repository
นี่คือเพื่อระบุว่าคลาสกำหนดที่เก็บข้อมูล
มีอะไรพิเศษเกี่ยวกับ @Repository
นอกจากนี้จะชี้ให้เห็นว่านี่เป็นคำอธิบายตามการกำหนดค่า , @Repositoryของงานคือการจับข้อยกเว้นแพลตฟอร์มที่เฉพาะเจาะจงและอีกครั้งโยนพวกเขาเป็นหนึ่งในฤดูใบไม้ผลิแบบครบวงจรยกเว้นไม่ถูกตรวจสอบ สำหรับสิ่งนี้เราได้รับพร้อมกับPersistenceExceptionTranslationPostProcessorว่าเราจะต้องเพิ่มในบริบทแอปพลิเคชันของ Spring ดังนี้:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
ตัวประมวลผล bean โพสต์นี้เพิ่มที่ปรึกษาให้กับ bean ใด ๆ ที่มีหมายเหตุประกอบ@Repositoryเพื่อให้มีข้อยกเว้นเฉพาะแพลตฟอร์มใด ๆ ถูกดักจับแล้วโยนใหม่เป็นข้อยกเว้นการเข้าถึงข้อมูลที่ไม่ได้ตรวจสอบของ Spring อย่างใดอย่างหนึ่ง
@Controller
@Controllerคำอธิบายประกอบแสดงให้เห็นว่าระดับโดยเฉพาะอย่างยิ่งทำหน้าที่บทบาทของตัวควบคุมที่ @Controllerคำอธิบายประกอบทำหน้าที่เป็นกฎตายตัวสำหรับการเรียนข้อเขียนที่แสดงให้เห็นบทบาทของตัวเอง
มีอะไรพิเศษเกี่ยวกับ @Controller?
เราไม่สามารถสลับคำอธิบายประกอบนี้ด้วยสิ่งอื่นใดเช่น@Serviceหรือ@Repositoryแม้ว่าพวกเขาจะดูเหมือนกัน โปรแกรมเลือกจ่ายงานจะสแกนคลาสที่มีหมายเหตุประกอบด้วย@Controllerและตรวจจับเมธอดหมายเหตุประกอบกับ@RequestMappingหมายเหตุประกอบภายใน เราสามารถใช้@RequestMappingเปิด / ในวิธีการเหล่านั้นเท่านั้นที่มีชั้นเรียนจะมีข้อเขียน@Controllerและมันจะไม่ทำงานร่วมกับ@Component, @Service, @Repositoryฯลฯ ...
หมายเหตุ: ถ้าชั้นมีการลงทะเบียนแล้วเป็นถั่วผ่านวิธีการอื่นใด ๆ เช่นผ่าน@Beanหรือผ่าน@Component, @Serviceฯลฯ ... คำอธิบายประกอบแล้ว@RequestMappingสามารถเลือกถ้าชั้นจะยังมีคำอธิบายประกอบกับ@RequestMappingคำอธิบายประกอบ แต่นั่นเป็นสถานการณ์ที่แตกต่าง
@บริการ
@Service beans เก็บตรรกะทางธุรกิจและวิธีการโทรในเลเยอร์ที่เก็บ
มีอะไรพิเศษเกี่ยวกับ @Service?
นอกเหนือจากความจริงที่ว่ามันใช้เพื่อระบุว่ามันถือตรรกะทางธุรกิจไม่มีอะไรที่เห็นได้ชัดเจนในบันทึกย่อนี้ แต่ใครจะรู้สปริงอาจเพิ่มสิ่งพิเศษเพิ่มเติมในอนาคต
มีอะไรอีกบ้าง?
คล้ายกับข้างต้นในอนาคตฤดูใบไม้ผลิอาจเพิ่มฟังก์ชันพิเศษ@Service, @Controllerและ@Repositoryอยู่บนพื้นฐานของการประชุม layering ของพวกเขา ดังนั้นจึงเป็นความคิดที่ดีที่จะเคารพการประชุมและใช้มันให้สอดคล้องกับเลเยอร์