เนื่องจากคำตอบจำนวนมากระบุว่าใช้คำอธิบายประกอบเหล่านี้แล้วเราจะเน้นที่ความแตกต่างเล็กน้อยระหว่างคำเหล่านี้
ก่อนอื่นความคล้ายคลึงกัน
จุดแรกที่ควรเน้นอีกครั้งคือการสแกนด้วยการตรวจจับอัตโนมัติและการฉีดพึ่งพาสำหรับ 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 ของพวกเขา ดังนั้นจึงเป็นความคิดที่ดีที่จะเคารพการประชุมและใช้มันให้สอดคล้องกับเลเยอร์