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 @Repositorysecara umum. Mereka dipindai karena mereka sendiri diberi penjelasan @Component.
Lihat saja @Controller, @Servicedan @Repositorydefinisi anotasi:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
Jadi, tidak salah untuk mengatakan itu @Controller, @Servicedan @Repositorymerupakan 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 @Componentanotasi, yang berarti juga @Components. 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 , @Repositorytugasnya 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 @Repositorysehingga setiap pengecualian spesifik platform ditangkap dan kemudian dilemparkan kembali sebagai salah satu pengecualian akses data Spring yang tidak dicentang.
@ Kontrol
The @Controllerpenjelasan 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 @Serviceatau @Repository, meskipun mereka terlihat sama. Dispatcher memindai kelas yang dianotasi @Controllerdan mendeteksi metode yang dianotasi dengan @RequestMappinganotasi di dalamnya. Kita dapat menggunakan @RequestMappingon / hanya metode-metode yang kelas dijelaskan dengan @Controllerdan itu akan tidak bekerja dengan @Component, @Service, @Repositorydll ...
Catatan: Jika kelas sudah terdaftar sebagai kacang melalui metode alternatif, seperti melalui @Beanatau melalui @Component, @Servicedll ... anotasi, maka @RequestMappingdapat dipilih jika kelas juga dijelaskan dengan @RequestMappinganotasi. 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, @Controllerdan @Repositoryberdasarkan pada konvensi layering mereka. Oleh karena itu, itu selalu merupakan ide yang baik untuk menghormati konvensi dan menggunakannya sesuai dengan lapisan.