Saya sedang mengembangkan aplikasi menggunakan Spring. Saya diharuskan menggunakan @Service
anotasi. Saya punya ServiceI
dan ServiceImpl
itu ServiceImpl implements ServiceI
. Saya bingung di sini di mana saya harus menyimpan @Service
anotasi.
Haruskah saya membubuhi keterangan antarmuka atau implementasinya @Service
? Apa perbedaan antara kedua pendekatan ini?
Jawaban:
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,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
sumber
@Transactional
adalah salah satu contoh di mana proxy untuk kacang digunakan. AOP adalah satu lagi.Pada dasarnya anotasi seperti @Service , @Repository , @Component , dll. Semuanya memiliki tujuan yang sama:
Dari pengalaman saya, saya selalu menggunakan
@Service
anotasi pada antarmuka atau kelas abstrak dan anotasi seperti@Component
dan@Repository
untuk implementasinya.@Component
anotasi yang saya gunakan pada kelas-kelas yang melayani tujuan dasar, kacang Spring sederhana, tidak lebih.@Repository
annotation yang saya gunakan dalamDAO
layer, untuk misalnya jika saya harus berkomunikasi dengan database, melakukan beberapa transaksi, dll.Jadi saya akan menyarankan untuk membubuhi keterangan antarmuka Anda dengan
@Service
dan lapisan lainnya tergantung pada fungsi.sumber
Saya menggunakan
@Component
,@Service
,@Controller
dan@Repository
anotasi hanya pada kelas implementasi dan bukan pada antarmuka. Tapi@Autowired
penjelasan dengan Antarmuka masih bekerja untuk saya.sumber
Kelebihan dari menempatkan anotasi pada @Service adalah memberikan petunjuk bahwa itu adalah layanan. Saya tidak tahu apakah ada kelas pelaksana yang secara bawaan akan mewarisi pengumuman ini.
Sisi con adalah bahwa Anda menggabungkan antarmuka Anda dengan kerangka kerja tertentu yaitu Spring, dengan menggunakan anotasi khusus spring. Karena antarmuka seharusnya dipisahkan dari implementasi, saya tidak akan menyarankan menggunakan kerangka kerja Anotasi khusus atau bagian objek dari antarmuka Anda.
sumber
Salah satu manfaat pegas adalah dengan mudah mengganti implementasi Layanan (atau lainnya). Untuk ini, Anda perlu membuat catatan pada antarmuka dan mendeklarasikan variabel seperti ini:
dan tidak :
Seperti kasus pertama, Anda dapat mengaktifkan implementasi yang akan disuntikkan dari saat itu unik (hanya satu kelas yang mengimplementasikan antarmuka). Dalam kasus kedua, Anda perlu memperbaiki semua kode Anda (implementasi kelas baru memiliki nama lain). Sebagai konsekuensinya, penjelasan harus ada di antarmuka sebanyak mungkin. Lebih jauh lagi, proksi JDK sangat cocok untuk ini: mereka dibuat dan dipakai pada startup aplikasi karena tipe runtime dikenal sebelumnya, bertentangan dengan proksi CGlib.
sumber
@Service
implementasi dan autowire antarmuka. Spring akan memeriksa objek apa pun yang mengimplementasikan antarmuka ini.Saya akan memakai
@Service
kelas Anda tetapi menempatkan nama antarmuka sebagai parameter untuk contoh anotasiDengan melakukan itu, Anda mendapatkan semua manfaat dan masih bisa menyuntikkan antarmuka tetapi mendapatkan kelas
Jadi antarmuka Anda tidak terikat pada kerangka pegas dan Anda dapat mengubah kelas kapan saja dan tidak harus memperbarui semua titik injeksi Anda.
Jadi jika saya ingin mengubah kelas implementasi saya hanya bisa menjelaskan kelas baru dan menghapus dari yang pertama tapi itu saja yang perlu diubah. Jika Anda menyuntikkan kelas Anda bisa memiliki banyak pekerjaan kapan pun Anda ingin mengubah kelas impl.
sumber
Untuk membuatnya lebih sederhana:
@Service adalah anotasi Stereotype untuk lapisan layanan .
@Repository adalah penjelasan Stereotype untuk ketekunan lapisan.
@Component adalah anotasi stereotip generik yang digunakan untuk memberi tahu Spring untuk membuat instance objek dalam Konteks Aplikasi. Dimungkinkan untuk menentukan nama apa pun untuk instance, defaultnya adalah nama kelas sebagai case unta.
sumber
Ada 5 anotasi yang dapat digunakan untuk membuat kacang panjang. Tuliskan jawaban di bawah ini.
Apakah Anda benar-benar membutuhkan antarmuka? Jika Anda akan memiliki satu implementasi untuk setiap antarmuka layanan, hindari saja, gunakan hanya kelas. Tentu saja, jika Anda tidak memiliki RMI atau ketika antarmuka proxy diperlukan.
@Repository - gunakan untuk menyuntikkan kelas lapisan dao Anda.
@Service - gunakan untuk menyuntikkan kelas lapisan layanan Anda. Di lapisan layanan juga Anda mungkin perlu menggunakan penjelasan @Transaksional untuk manajemen transaksi db.
@Controller - gunakan untuk pengontrol layer frontend Anda, seperti suntikan kacang yang dikelola JSF sebagai kacang pegas.
@RestController - gunakan untuk pengendali spring rest, ini akan membantu Anda menghindari setiap saat untuk memasukkan penjelasan @ResponseBody dan @RequestBody dalam metode istirahat Anda.
@Component - gunakan dalam kasus lain ketika Anda perlu Menyuntikkan spring bean yang bukan pengontrol, layanan, atau kelas dao
sumber