Karena banyak jawaban sudah menyatakan untuk apa anotasi ini digunakan, kami di sini akan fokus pada beberapa perbedaan kecil di antara mereka.
Pertama, Kesamaan
Poin pertama yang perlu disorot lagi adalah itu sehubungan dengan pemindaian-deteksi otomatis dan injeksi dependensi untuk BeanDefinition, semua anotasi ini (yaitu, @Component, @Service, @Repository, @Controller) adalah sama. Kita dapat menggunakan satu di tempat yang lain dan masih bisa mendapatkan jalan kita.
Perbedaan antara @Component, @Repository, @Controller dan @Service
@Komponen
Ini adalah penjelasan stereotip tujuan umum yang menunjukkan bahwa kelas adalah komponen pegas.
Apa yang istimewa tentang pemindaian
<context:component-scan>
hanya @Component@Component
dan tidak mencari@Controller
,@Service
dan @Repository
secara umum. Mereka dipindai karena mereka sendiri diberi penjelasan @Component
.
Lihat saja @Controller
, @Service
dan @Repository
definisi anotasi:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Jadi, tidak salah untuk mengatakan itu @Controller
, @Service
dan @Repository
merupakan tipe khusus@Component
penjelasan khusus. <context:component-scan>
jemput mereka dan daftarkan kelas-kelas berikut sebagai kacang, seolah-olah mereka diberi penjelasan @Component
.
Anotasi jenis khusus juga dipindai, karena mereka sendiri dijelaskan dengan @Component
anotasi, yang berarti juga @Component
s. Jika kami menetapkan anotasi khusus kami sendiri dan memberikan anotasi dengannya @Component
, ia juga akan dipindai<context:component-scan>
@Gudang
Ini untuk menunjukkan bahwa kelas mendefinisikan repositori data.
Apa yang spesial dari @Repository?
Selain menunjukkan, bahwa ini adalah Konfigurasi berbasis Annotation , @Repository
tugasnya adalah menangkap pengecualian spesifik platform dan melemparkannya kembali sebagai salah satu pengecualian Spring yang tidak dicentang dan tidak dicocokkan. Untuk ini, kami disediakan PersistenceExceptionTranslationPostProcessor
, yang kami harus tambahkan dalam konteks aplikasi Spring kami seperti ini:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Pemroses posting kacang ini menambahkan penasihat untuk setiap kacang yang diberi keterangan @Repository
sehingga setiap pengecualian spesifik platform ditangkap dan kemudian dilemparkan kembali sebagai salah satu pengecualian akses data Spring yang tidak dicentang.
@ Kontrol
The @Controller
penjelasan menunjukkan bahwa kelas tertentu menyajikan peran controller. Itu@Controller
penjelasan bertindak sebagai stereotip untuk kelas dijelaskan, menunjukkan perannya.
Apa yang spesial dari @Controller?
Kami tidak dapat mengganti anotasi ini dengan yang lain seperti @Service
atau @Repository
, meskipun mereka terlihat sama. Dispatcher memindai kelas yang dianotasi @Controller
dan mendeteksi metode yang dianotasi dengan @RequestMapping
anotasi di dalamnya. Kita dapat menggunakan @RequestMapping
on / hanya metode-metode yang kelas dijelaskan dengan @Controller
dan itu akan tidak bekerja dengan @Component
, @Service
, @Repository
dll ...
Catatan: Jika kelas sudah terdaftar sebagai kacang melalui metode alternatif, seperti melalui @Bean
atau melalui @Component
, @Service
dll ... anotasi, maka @RequestMapping
dapat dipilih jika kelas juga dijelaskan dengan @RequestMapping
anotasi. Tapi itu skenario yang berbeda.
@Layanan
@Service
kacang memegang logika bisnis dan memanggil metode di lapisan repositori.
Apa yang spesial dari @Service?
Terlepas dari kenyataan bahwa itu digunakan untuk menunjukkan, bahwa itu memegang logika bisnis, tidak ada yang terlihat dalam anotasi ini; tapi siapa tahu, Spring dapat menambahkan beberapa tambahan luar biasa di masa depan.
Apa lagi?
Mirip dengan di atas, di musim semi yang akan datang dapat menambahkan fungsi khusus untuk @Service
, @Controller
dan @Repository
berdasarkan pada konvensi layering mereka. Oleh karena itu, itu selalu merupakan ide yang baik untuk menghormati konvensi dan menggunakannya sesuai dengan lapisan.