Pertanyaan Apa perbedaan antara @Component, @Repository & @Service anotasi di Musim Semi?


Bisa @Component, @Repository dan @Service anotasi digunakan secara bergantian di Musim Semi atau apakah mereka menyediakan fungsi tertentu selain bertindak sebagai alat notasi?

Dengan kata lain, jika saya memiliki kelas Layanan dan saya mengubah anotasi dari @Service untuk @Component, apakah masih berperilaku dengan cara yang sama?

Atau apakah anotasi itu juga memengaruhi perilaku dan fungsi kelas?


1515
2017-07-26 09:10


asal


Jawaban:


Dari Dokumentasi Musim Semi:

Di Spring 2.0 dan yang lebih baru, the @Repository anotasi adalah penanda untuk   kelas apa pun yang memenuhi peran atau stereotip (juga dikenal sebagai Data   Access Object atau DAO) dari suatu repositori. Di antara penggunaan penanda ini   adalah terjemahan otomatis dari pengecualian.

Spring 2.5 memperkenalkan anotasi stereotip lebih lanjut: @Component,    @Service, dan @Controller. @Component adalah stereotip umum untuk apa pun   Komponen yang dikelola dengan musim semi. @Repository, @Service, dan @Controller adalah   spesialisasi dari @Component untuk kasus penggunaan yang lebih spesifik, untuk   contoh, dalam ketekunan, layanan, dan lapisan presentasi,   masing-masing.

Oleh karena itu, Anda dapat membubuhkan keterangan kelas komponen Anda @Component,   tetapi dengan memberi anotasi pada mereka @Repository, @Service, atau @Controller   sebagai gantinya, kelas Anda lebih sesuai untuk diproses oleh alat   atau berhubungan dengan aspek. Misalnya, anotasi stereotip ini   buat target ideal untuk pointcuts.

Jadi, jika Anda memilih antara menggunakan @Component atau @Service untuk   lapisan layanan Anda, @Service jelas merupakan pilihan yang lebih baik. Demikian pula,   sebagaimana disebutkan di atas, @Repository sudah didukung sebagai penanda untuk   terjemahan pengecualian otomatis di lapisan persistensi Anda.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘

1110
2017-08-01 10:20



Karena banyak jawaban sudah menyatakan apa anotasi ini digunakan, kami akan di sini fokus pada beberapa perbedaan kecil di antara mereka.

Pertama-tama Kesamaan 

Titik pertama yang perlu disoroti lagi adalah itu sehubungan dengan scan-auto-detection dan injeksi ketergantungan untuk BeanDefinition semua anotasi ini (yaitu, @Component, @Service,   @Repository, @Controller) adalah sama. Kami dapat menggunakan satu di tempat   dari yang lain dan masih bisa mendapatkan jalan kita.


Perbedaan antara @Component, @Repository, @Controller dan @Service

@Komponen

Ini adalah anotasi stereotip tujuan umum yang menunjukkan bahwa kelas adalah komponen pegas.

Apa yang spesial tentang @Component
<context:component-scan> hanya scan @Component dan tidak mencari @Controller, @Service dan @Repository secara umum. Mereka dipindai karena mereka sendiri dianotasi @Component.

Coba 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 adalah tipe khusus @Component anotasi. <context:component-scan> mengambil mereka dan mendaftarkan kelas-kelas berikut mereka sebagai kacang, seolah-olah mereka diberi catatan @Component.

Mereka dipindai karena mereka sendiri dianotasi @Component anotasi. Jika kami mendefinisikan anotasi khusus kami sendiri dan memberi anotasi dengan itu @Component, maka itu juga akan dipindai <context:component-scan>


@Gudang

Ini untuk menunjukkan bahwa kelas mendefinisikan repositori data.

Apa yang spesial tentang @Repository? 

Selain menunjukkan bahwa ini adalah sebuah Konfigurasi berbasis Anotasi, @RepositoryTugasnya adalah untuk menangkap pengecualian tertentu Platform dan membuangnya kembali sebagai salah satu pengecualian tak terkendali di Spring. Dan untuk ini, kami disediakan PersistenceExceptionTranslationPostProcessor, yang harus kami tambahkan dalam konteks aplikasi Musim Semi kami seperti ini:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Proses pasca kacang ini menambahkan penasihat untuk kacang apa pun yang dianotasi @Repository sehingga pengecualian khusus platform apa pun ditangkap dan kemudian rethrown sebagai salah satu pengecualian akses data yang tidak dicentang Spring.


@Kontroler

Itu @Controller anotasi menunjukkan bahwa kelas tertentu melayani peran pengontrol. Itu @Controller anotasi bertindak sebagai stereotip untuk kelas beranotasi, yang menunjukkan perannya.

Apa yang spesial tentang @Controller? 

Kami tidak dapat mengganti anotasi ini dengan yang lain seperti @Service atau @Repository, meskipun mereka terlihat sama. Petugas operator memindai kelas yang dianotasi @Controller dan mendeteksi @RequestMapping penjelasan di dalamnya. Kami hanya bisa menggunakannya @RequestMapping di @Controller kelas beranotasi.


@Layanan

@Services memegang logika bisnis dan metode panggilan dalam lapisan repositori.

Apa yang spesial tentang @Service? 

Terlepas dari fakta bahwa ini digunakan untuk menunjukkan bahwa itu memegang logika bisnis, tidak ada spesialisasi khusus yang diberikan anotasi ini, tetapi siapa tahu, musim semi dapat menambahkan beberapa tambahan yang luar biasa di masa mendatang.


Apa lagi?

Mirip dengan di atas, di musim semi mendatang dapat memilih untuk menambahkan fungsi khusus untuk @Service, @Controller dan @Repository berdasarkan konvensi layering mereka. Oleh karena itu, selalu ide yang baik untuk menghormati konvensi dan menggunakannya sesuai dengan lapisan.


423
2017-07-24 06:43



Mereka hampir sama - semuanya berarti bahwa kelas adalah kacang Spring. @Service, @Repository dan @Controller terspesialisasi @Components. Anda dapat memilih untuk melakukan tindakan tertentu dengan mereka. Sebagai contoh:

  • @Controller kacang digunakan oleh spring-MVC
  • @Repository kacang memenuhi syarat untuk terjemahan persistensi pengecualian

Hal lain adalah bahwa Anda menunjuk komponen semantik ke lapisan yang berbeda.

Satu hal itu @Component penawaran adalah bahwa Anda dapat membubuhi anotasi penjelasan lain dengannya, lalu menggunakannya dengan cara yang sama @Service.

Misalnya baru-baru ini saya membuat:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Jadi semua kelas dianotasikan dengan @ScheduledJob adalah biji musim semi dan selain itu terdaftar sebagai pekerjaan kuarsa. Anda hanya perlu memberikan kode yang menangani anotasi spesifik.


388
2017-07-26 09:16



@Component setara dengan

<bean>

@Service, @Controller, @Repository = {@Component + beberapa fungsi khusus lainnya}

Itu berarti Layanan, Pengontrol dan Repositori secara fungsional sama.

Ketiga anotasi digunakan untuk memisahkan "Lapisan" di aplikasi Anda,

  • Pengontrol hanya melakukan hal-hal seperti mengirim, meneruskan, memanggil metode layanan, dll.
  • Layanan Memegang logika bisnis, Perhitungan, dll.
  • Repositori adalah DAO (Data Access Objects), mereka mengakses database secara langsung.

Sekarang Anda mungkin bertanya mengapa memisahkan mereka: (Saya berasumsi Anda tahu AOP-Aspect Oriented Programming)

Katakanlah Anda ingin Memantau Aktivitas Lapisan DAO saja. Anda akan menulis kelas Aspect (Kelas A) yang melakukan pencatatan sebelum dan sesudah setiap metode DAO Anda dipanggil, Anda dapat melakukannya menggunakan AOP karena Anda memiliki tiga Lapisan berbeda dan tidak tercampur.

Jadi Anda bisa melakukan pencatatan DAO "sekitar", "sebelum" atau "setelah" metode DAO. Anda bisa melakukan itu karena Anda memiliki DAO di tempat pertama. Apa yang baru saja Anda capai adalah Pemisahan kekhawatiran atau tugas.

Bayangkan jika hanya ada satu anotasi @Controller, maka komponen ini akan mengirim, logika bisnis dan mengakses database semua kode campuran, jadi kotor!

Di atas disebutkan adalah salah satu skenario yang sangat umum, ada banyak lagi kasus penggunaan mengapa menggunakan tiga anotasi.


332
2018-05-23 05:15



Di musim semi @Component, @Service, @Controller, dan @Repository adalah anotasi Stereotype yang digunakan untuk:

@Controller: dimana kamu permintaan  memetakan dari halaman presentasi selesai. Lapisan presentasi tidak akan masuk ke file lain yang langsung diteruskan ke @Controller kelas dan memeriksa jalur yang diminta di @RequestMapping anotasi yang ditulis sebelum pemanggilan metode jika perlu.

@Service: Semua logika bisnis ada di sini yaitu Data yang terkait perhitungan dan semua. Ini penjelasan lapisan bisnis di mana pengguna kami tidak secara langsung memanggil metode persistensi sehingga akan memanggil metode ini menggunakan anotasi ini. Ini akan meminta @Repository sesuai permintaan pengguna

@Repository: Ini adalah layer Persistensi (Data Access Layer) dari aplikasi yang digunakan untuk mendapatkan data dari database. yaitu semua operasi terkait Database dilakukan oleh repositori.

@Component - Anotasikan komponen Anda yang lain (misalnya kelas sumber REST) ​​dengan stereotip komponen.

Menunjukkan bahwa kelas beranotasi adalah "komponen". Kelas seperti itu   dianggap sebagai kandidat untuk deteksi otomatis saat menggunakan   konfigurasi berbasis anotasi dan pemindaian classpath.

Anotasi tingkat kelas lainnya dapat dianggap sebagai mengidentifikasi a   komponen juga, biasanya jenis khusus dari komponen: mis. itu   Anotasi @Repository atau anotasi @Aspect AspectJ.

enter image description here


188
2018-03-25 08:00



Spring 2.5 memperkenalkan anotasi stereotip lebih lanjut: @Component, @Service dan @Controller. @Component berfungsi sebagai stereotip umum untuk setiap komponen yang dikelola Spring; sedangkan, @Repository, @Service, dan @Controller berfungsi sebagai spesialisasi @Component untuk kasus penggunaan yang lebih spesifik (misalnya, dalam ketekunan, layanan, dan lapisan presentasi, masing-masing). Apa artinya ini adalah bahwa Anda dapat membubuhi keterangan kelas komponen Anda dengan @Component, tetapi dengan annotating mereka dengan @Repository, @Service, atau @Controller sebagai gantinya, kelas Anda lebih sesuai untuk diproses oleh alat atau berhubungan dengan aspek. Sebagai contoh, anotasi stereotip ini membuat target ideal untuk pointcuts. Tentu saja, ada kemungkinan @Repository, @Service, dan @Controller dapat membawa semantik tambahan di rilis mendatang dari Spring Framework. Jadi, jika Anda membuat keputusan antara menggunakan @Component atau @Service untuk lapisan layanan Anda, @Service jelas merupakan pilihan yang lebih baik. Demikian pula, sebagaimana dinyatakan di atas, @Repository sudah didukung sebagai penanda untuk terjemahan pengecualian otomatis di lapisan persistensi Anda.

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

referensi: - Dokumentasi Musim Semi - pemindaian Classpath, komponen terkelola dan konfigurasi penulisan menggunakan Java  


59
2018-05-15 12:48



@Component – Indicates a auto scan component.  
@Repository – Indicates DAO component in the persistence layer.  
@Service – Indicates a Service component in the business layer.   
@Controller – Indicates a controller component in the presentation layer.  

Anda akan memperhatikan itu semua @Repository,@Service atau @Controller dianotasi dengan @Component. Jadi, bisakah kita menggunakan saja @Component untuk semua komponen untuk pemindaian otomatis? Ya, Anda bisa, dan Spring akan otomatis memindai semua komponen Anda dengan @Component dianotasi.

Ini berfungsi dengan baik, tetapi bukan praktik yang baik, agar terbaca, Anda harus selalu menyatakan @Repository,@Service atau @Controller untuk lapisan tertentu agar kode Anda lebih mudah dibaca.


51
2017-12-16 18:10



Penggunaan @Service dan @Repository anotasi penting dari perspektif koneksi basis data.

  1. Menggunakan @Service untuk semua jenis layanan web Anda koneksi DB
  2. Menggunakan @Repository untuk semua koneksi DB proc yang Anda simpan

Jika Anda tidak menggunakan anotasi yang tepat, Anda mungkin menghadapi pengecualian commit yang ditimpa oleh transaksi rollback. Anda akan melihat pengecualian selama stress load test yang terkait dengan roll back transaksi JDBC.


40
2017-11-02 16:05



Perbedaan Antara @Component, @Service dan @Repository

Perbedaan utama antara stereotipe ini adalah mereka digunakan untuk klasifikasi yang berbeda.

Dalam aplikasi multitier, kita akan memiliki lapisan yang berbeda seperti presentasi, layanan, bisnis, akses data, dll. Ketika sebuah kelas akan dianotasi untuk deteksi otomatis oleh Spring, maka kita harus menggunakan stereotip masing-masing seperti di bawah ini.

@Component - generik dan dapat digunakan di seluruh aplikasi.
@Service - membubuhi keterangan kelas pada tingkat lapisan layanan.
@Repository - membubuhi keterangan kelas pada lapisan persistensi, yang akan bertindak sebagai repositori database.

Jika secara teknis mereka akan sama maka mengapa kita perlu menggunakan ini pada tingkat lapisan yang berbeda. Mengapa tidak menggunakan yang sama di semua lapisan. Misalnya, jika kita menggunakan @Service di semua lapisan, semua biji akan mendapatkan instantiated dan tidak ada masalah. Ada perbedaan kecil, misalnya mempertimbangkan @Repository.

Postprocessor secara otomatis mencari semua penerjemah pengecualian (implementasi antarmuka PersistenceExceptionTranslator) dan menyarankan semua kacang ditandai dengan @Repository anotasi sehingga penerjemah yang ditemukan dapat mencegat dan menerapkan terjemahan yang sesuai pada pengecualian yang dibuang.

Mirip dengan di atas, di musim semi mendatang dapat memilih untuk menambahkan nilai @Service, @Controller dan @Repository berdasarkan konvensi layering mereka. Untuk itu keunggulan fitur tambahannya lebih baik untuk menghormati konvensi dan menggunakannya sesuai dengan lapisan.

Selain di atas, sehubungan dengan scan-auto-detection, injeksi ketergantungan untuk BeanDefinition @Component, @Service, @Repository, @Controller sama.


31
2017-10-10 08:11



@Gudang  @Layanan dan @Kontroler berfungsi sebagai spesialisasi @Component untuk penggunaan yang lebih spesifik atas dasar itu Anda dapat mengganti @Service ke @Component tetapi dalam kasus ini Anda kehilangan spesialisasi.

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.

24
2017-07-18 11:23