ฉันไม่เคยใส่@Component
(หรือ@Service
, ... ) ที่อินเทอร์เฟซเพราะสิ่งนี้ทำให้อินเทอร์เฟซไร้ประโยชน์ ให้ฉันอธิบายว่าทำไม
อ้างสิทธิ์ 1:หากคุณมีอินเทอร์เฟซแล้วคุณต้องการใช้อินเทอร์เฟซนั้นสำหรับประเภทจุดฉีด
ข้อเรียกร้อง 2:วัตถุประสงค์ของอินเทอร์เฟซคือการกำหนดสัญญาที่สามารถดำเนินการได้โดยการนำไปใช้งานหลาย ๆ ในอีกด้านหนึ่งคุณมีจุดฉีดยา ( @Autowired
) มีเพียงหนึ่งในอินเตอร์เฟซและเพียงหนึ่งชั้นเรียนที่ใช้มันเป็น (IMHO) ไร้ประโยชน์และละเมิดYAGNI
ข้อเท็จจริง:เมื่อคุณใส่:
@Component
(หรือ@Service
, ... ) ที่อินเทอร์เฟซ
- มีหลายชั้นเรียนที่ใช้มัน
- อย่างน้อยสองชั้นเรียนกลายเป็น Spring Beans และ
- มีจุดฉีดที่ใช้อินเทอร์เฟซสำหรับการฉีดตามประเภท
จากนั้นคุณจะได้รับและNoUniqueBeanDefinitionException
(หรือคุณมีการตั้งค่าการกำหนดค่าที่พิเศษมากพร้อมด้วยสภาพแวดล้อมโปรไฟล์หรือรอบคัดเลือก ... )
สรุป:หากคุณใช้@Component
(หรือ@Service
, ... ) ที่อินเทอร์เฟซคุณต้องละเมิดอย่างน้อยหนึ่งในสอง Clains ดังนั้นฉันคิดว่ามันไม่มีประโยชน์ (ยกเว้นบางสถานการณ์ที่หายาก) ที่จะวางไว้@Component
ที่ระดับอินเทอร์เฟซ
Spring-Data-JPA Repository อินเทอร์เฟซเป็นสิ่งที่แตกต่างกันโดยสิ้นเชิง