Saya tidak pernah menaruh @Component
(atau @Service
, ...) di antarmuka, karena ini membuat antarmuka tidak berguna. Biarkan saya jelaskan alasannya.
klaim 1: Jika Anda memiliki antarmuka maka Anda ingin menggunakan antarmuka itu untuk jenis titik injeksi.
klaim 2: Tujuan dari antarmuka adalah bahwa ia mendefinisikan kontrak yang dapat diimplementasikan oleh beberapa implementasi. Di sisi lain Anda memiliki titik injeksi ( @Autowired
). Memiliki hanya satu antarmuka dan hanya satu kelas yang mengimplementasikannya, adalah (IMHO) tidak berguna, dan melanggar YAGNI .
fakta: Ketika Anda menempatkan:
@Component
(atau @Service
, ...) di antarmuka,
- memiliki beberapa kelas yang mengimplementasikannya,
- setidaknya dua kelas menjadi Spring Beans, dan
- memiliki titik injeksi yang menggunakan antarmuka untuk injeksi berbasis tipe,
maka Anda akan mendapatkan dan NoUniqueBeanDefinitionException
(atau Anda memiliki pengaturan konfigurasi yang sangat khusus, dengan Lingkungan, Profil atau Kualifikasi ...)
Kesimpulan: Jika Anda menggunakan @Component
(atau @Service
, ...) pada sebuah antarmuka maka Anda harus melanggar setidaknya satu dari dua clain. Oleh karena itu saya pikir tidak berguna (kecuali beberapa skenario langka) untuk diletakkan @Component
pada level antarmuka.
Antarmuka Spring-Data-JPA Repository adalah sesuatu yang sangat berbeda