Bisa @Component
,@Repository
dan @Service
anotasi digunakan secara bergantian di Spring atau apakah ia menyediakan fungsionalitas tertentu selain bertindak sebagai perangkat notasi?
Dengan kata lain, jika saya memiliki kelas Layanan dan saya mengubah anotasi dari @Service
menjadi @Component
, apakah masih akan berlaku seperti itu?
Atau apakah anotasi juga memengaruhi perilaku dan fungsi kelas?
java
spring
spring-mvc
annotations
Colin McCree
sumber
sumber
Jawaban:
Dari Dokumentasi Musim Semi :
sumber
@Service
ini juga@Component
(karena@Service
penjelasan itu sendiri dijelaskan dengan@Component
). Sejauh yang saya tahu, tidak ada dalam kerangka Spring yang secara eksplisit menggunakan fakta bahwa ada sesuatu@Service
, jadi perbedaannya hanyalah konseptual.Karena banyak jawaban sudah menyatakan untuk apa anotasi ini digunakan, kami di sini akan fokus pada beberapa perbedaan kecil di antara mereka.
Perbedaan antara @Component, @Repository, @Controller dan @Service
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: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>
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 disediakanPersistenceExceptionTranslationPostProcessor
, yang kami harus tambahkan dalam konteks aplikasi Spring kami seperti ini: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.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.@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.
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.sumber
@Controller
anotasi. Tidak diperlukan jika kelas dijelaskan dengan@RequestMapping
dan kacang kelas ini dibuat dengan cara apa pun. Setiap kacang yang diberi penjelasan dengan@Controller
OR@RequestMapping
akan berpartisipasi dalam pemetaan permintaan Spring MVC. Ini dapat berguna misalnya untuk membuat pengontrol terprogram (misalnya menggunakan@Bean
metode) dan pada saat yang sama untuk mencegah Spring mencoba membuatnya dengan pemindaian paket (jika paket tidak dapat dikecualikan dari pemindaian).Mereka hampir sama - semuanya berarti bahwa kelas adalah kacang Spring.
@Service
,@Repository
dan@Controller
terspesialisasi@Component
. Anda dapat memilih untuk melakukan tindakan tertentu dengannya. Sebagai contoh:@Controller
kacang digunakan oleh musim semi-mvc@Repository
kacang memenuhi syarat untuk terjemahan pengecualian kegigihanHal lain adalah Anda menetapkan komponen secara semantik ke berbagai lapisan.
Satu hal yang
@Component
menawarkan adalah Anda dapat membuat anotasi anotasi lain dengannya, lalu menggunakannya dengan cara yang sama@Service
.Misalnya baru-baru ini saya buat:
Jadi semua kelas yang dijelaskan dengan
@ScheduledJob
adalah kacang musim semi dan selain itu terdaftar sebagai pekerjaan kuarsa. Anda hanya perlu memberikan kode yang menangani anotasi spesifik.sumber
@Component setara dengan
@Service, @Controller, @Repository = {@Component + beberapa fungsi khusus}
Itu berarti Layanan, Pengontrol dan Repositori secara fungsional sama.
Tiga anotasi digunakan untuk memisahkan "Layers" di aplikasi Anda,
Sekarang Anda mungkin bertanya mengapa memisahkan mereka: (Saya berasumsi Anda tahu Pemrograman Berorientasi AOP-Aspect)
Katakanlah Anda hanya ingin Memantau Aktivitas Lapisan DAO. Anda akan menulis kelas Aspect (A class) yang melakukan logging sebelum dan setelah setiap metode DAO Anda dipanggil, Anda dapat melakukannya dengan menggunakan AOP karena Anda memiliki tiga Layers yang berbeda dan tidak dicampur.
Jadi Anda dapat 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 masalah atau tugas.
Bayangkan jika hanya ada satu penjelasan @Controller, maka komponen ini akan memiliki pengiriman, logika bisnis dan mengakses basis data semua campuran, kode begitu kotor!
Disebutkan di atas adalah satu skenario yang sangat umum, ada lebih banyak kasus penggunaan mengapa menggunakan tiga penjelasan.
sumber
@Respository
juga memiliki fitur terjemahan pengecualian otomatis. Seperti ketika pengecualian terjadi di@Repository
biasanya ada handler untuk pengecualian itu dan tidak perlu menambahkan blok coba tangkap di kelas DAO. Ini digunakan bersama dengan PersistenceExceptionTranslationPostProcessorDi musim semi
@Component
,@Service
,@Controller
, dan@Repository
yang Stereotype penjelasan yang digunakan untuk:@Controller:
di mana pemetaan permintaan Anda dari halaman presentasi dilakukan yaitu lapisan Presentasi tidak akan pergi ke file lain itu langsung ke@Controller
kelas dan memeriksa jalur yang diminta dalam@RequestMapping
anotasi yang ditulis sebelum pemanggilan metode jika perlu.@Service
: Semua logika bisnis ada di sini, yaitu kalkulasi terkait data dan semuanya. Penjelasan lapisan bisnis ini di mana pengguna kami tidak secara langsung memanggil metode kegigihan sehingga akan memanggil metode ini menggunakan anotasi ini. Ini akan meminta @Repositori sesuai permintaan pengguna@Repository
: Ini adalah layer Persistence (Data Access Layer) dari aplikasi yang digunakan untuk mendapatkan data dari database. yaitu semua operasi yang berhubungan dengan Database dilakukan oleh repositori.@Component
- Buat anotasi komponen Anda yang lain (misalnya kelas sumber daya REST) dengan stereotip komponen.sumber
referensi: - Dokumentasi Pegas - Pemindaian classpath, komponen terkelola, dan konfigurasi penulisan menggunakan Java
sumber
Secara teknis
@Controller
,@Service
,@Repository
semua sama. Semuanya meluas@Component
.Dari kode sumber Spring:
Menunjukkan bahwa kelas beranotasi adalah "komponen". Kelas semacam itu dianggap sebagai kandidat untuk deteksi otomatis ketika menggunakan konfigurasi berbasis anotasi dan pemindaian classpath.
Kami langsung dapat menggunakan
@Component
untuk setiap kacang, tapi untuk pemahaman yang lebih baik dan pemeliharaan dari aplikasi yang besar, kita gunakan@Controller
,@Service
,@Repository
.Tujuan dari setiap anotasi:
@Controller
-> Kelas yang dijelaskan dengan ini, dimaksudkan untuk menerima permintaan dari sisi klien. Permintaan pertama datang ke Servlet Dispatcher, dari mana ia mengirimkan permintaan ke pengontrol tertentu menggunakan nilai@RequestMapping
anotasi.@Service
-> Kelas yang dijelaskan dengan ini, dimaksudkan untuk memanipulasi data, yang kami terima dari klien atau mengambil dari database. Semua manipulasi dengan data harus dilakukan di lapisan ini.@Repository
-> Kelas yang dijelaskan dengan ini, dimaksudkan untuk terhubung dengan database. Itu juga dapat dianggap sebagai lapisan DAO (Data Access Object). Lapisan ini harus dibatasi hanya untuk operasi CRUD (buat, ambil, perbarui, hapus). Jika diperlukan manipulasi, data harus dikirim dikirim kembali ke lapisan @Service.Jika kami menukar tempat mereka (digunakan
@Repository
sebagai pengganti@Controller
), aplikasi kami akan berfungsi dengan baik.Tujuan utama menggunakan tiga berbeda
@annotations
adalah untuk menyediakan Modularitas yang lebih baik untuk aplikasi Enterprise.sumber
controller and repository
Penggunaan
@Service
dan@Repository
anotasi penting dari perspektif koneksi basis data.@Service
untuk semua jenis koneksi DB layanan web Anda@Repository
untuk semua koneksi DB proc tersimpan AndaJika Anda tidak menggunakan anotasi yang tepat, Anda dapat menghadapi pengecualian komit yang ditimpa oleh transaksi rollback. Anda akan melihat pengecualian selama stress load test yang terkait dengan memutar kembali transaksi JDBC.
sumber
@Repository
secara khusus dirancang untuk bekerja dengan lapisan persistensi. Jika Anda bekerja dengan api istirahat - Anda bekerja dengan DTO, bukan DAO.@Repository @Service dan @Controller 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.
sumber
semua anotasi ini adalah tipe tipe stereo anotasi, perbedaan antara ketiga anotasi tersebut
sebagai contoh
@Service
atau@Repositroy
atau@Controller
anotasi secara default,@Component
anotasi akan ada di atas kelassumber
Spring menyediakan empat jenis komponen auto penjelasan scan, mereka
@Component
,@Service
,@Repository
dan@Controller
. Secara teknis, tidak ada perbedaan di antara mereka, tetapi setiap anotasi pemindaian komponen otomatis harus digunakan untuk tujuan khusus dan di dalam lapisan yang ditentukan.@Component
: Ini adalah anotasi pemindaian komponen otomatis dasar, ini menunjukkan kelas yang dianotasi adalah komponen pemindaian otomatis.@Controller
: Kelas beranotasi menunjukkan bahwa itu adalah komponen pengontrol, dan terutama digunakan pada lapisan presentasi.@Service
: Ini menunjukkan kelas beranotasi adalah komponen Layanan di lapisan bisnis.@Repository
: Anda perlu menggunakan anotasi ini di dalam lapisan persistensi, ini bertindak seperti repositori basis data.Seseorang harus memilih bentuk yang lebih khusus
@Component
ketika menjelaskan kelas mereka karena penjelasan ini mungkin mengandung perilaku spesifik yang akan datang.sumber
Kami dapat menjawab ini sesuai dengan standar java
Mengacu pada
JSR-330
, yang sekarang didukung oleh pegas, Anda hanya dapat menggunakan@Named
untuk mendefinisikan kacang (Entah bagaimana@Named=@Component
). Jadi menurut standar ini, tampaknya bahwa tidak ada gunanya untuk menentukan stereotip (seperti@Repository
,@Service
,@Controller
) untuk kacang kategori.Tetapi pegas pengguna anotasi yang berbeda ini dalam berbeda untuk penggunaan khusus, misalnya:
aspect-oriented
, ini bisa menjadi kandidat yang bagus untukpointcuts
)@Repository
anotasi akan menambahkan beberapa fungsi ke kacang Anda (beberapa terjemahan pengecualian otomatis ke lapisan kegigihan kacang Anda).@RequestMapping
hanya bisa ditambahkan ke kelas yang dijelaskan oleh@Controller
.sumber
Buat anotasi komponen lain dengan @Component, misalnya kelas Sumberdaya REST.
@Component adalah stereotip umum untuk komponen yang dikelola Spring.
@Controller, @Service dan @Repository adalah Spesialisasi dari @Component untuk kasus penggunaan tertentu.
@Component di Musim Semi
sumber
Tidak ada perbedaan antara
@Component
,@Service
,@Controller
,@Repository
.@Component
adalah anotasi Generik untuk mewakili komponen MVC kami. Tetapi akan ada beberapa komponen sebagai bagian dari aplikasi MVC kami seperti komponen lapisan layanan, komponen lapisan kegigihan dan komponen lapisan presentasi. Jadi untuk membedakan mereka, orang-orang musim semi telah memberikan tiga penjelasan lainnya juga.@Repository
@Service
@Controller
@Component
untuk semuanya.sumber
Bahkan jika kita menukar @Component atau @Repository atau @service
Itu akan berperilaku sama, tetapi satu aspek adalah bahwa mereka tidak akan dapat menangkap beberapa pengecualian spesifik terkait dengan DAO daripada Repositori jika kita menggunakan komponen atau layanan @
sumber
Di Spring 4, versi terbaru:
sumber
@Component : Anda memberi anotasi pada sebuah kelas
@Component
, ia memberi tahu hibernate bahwa itu adalah sebuah Bean.@Repositori : Anda memberi anotasi pada sebuah kelas
@Repository
, ia memberi tahu hibernate bahwa itu adalah kelas DAO dan memperlakukannya sebagai kelas DAO. Berarti itu membuat pengecualian yang tidak dicentang (dilempar dari metode DAO) memenuhi syarat untuk diterjemahkan ke dalam Musim SemiDataAccessException
.@ Layanan : Ini memberitahu hibernate itu adalah kelas Layanan di mana Anda akan memiliki
@Transactional
dll anotasi lapisan Layanan sehingga hibernate memperlakukannya sebagai komponen Layanan.Plus
@Service
adalah uang muka@Component
. Asumsikan nama kelas kacang adalahCustomerService
, karena Anda tidak memilih cara konfigurasi kacang XML sehingga Anda menjelaskan kacang dengan@Component
menunjukkannya sebagai Kacang. Jadi saat mendapatkan objek beanCustomerService cust = (CustomerService)context.getBean("customerService");
Secara default, Spring akan menurunkan huruf pertama karakter komponen - dari 'Layanan Pelanggan' hingga 'Layanan Pelanggan'. Dan Anda dapat mengambil komponen ini dengan nama 'layanan pelanggan'. Tetapi jika Anda menggunakan@Service
anotasi untuk kelas kacang Anda bisa memberikan nama kacang tertentu dengandan Anda bisa mendapatkan objek bean dengan
sumber
@Component
adalah anotasi umum tingkat atas yang membuat kacang beranotasi dipindai dan tersedia dalam wadah DI@Repository
adalah anotasi khusus dan fitur konversi semua pengecualian yang tidak dicentang dari kelas DAO@Service
adalah anotasi khusus. itu tidak membawa fitur baru seperti sekarang tetapi itu menjelaskan maksud kacang@Controller adalah anotasi khusus yang membuat bean MVC sadar dan memungkinkan penggunaan anotasi lebih lanjut seperti
@RequestMapping
dan semuaBerikut ini rincian lebih lanjut
sumber
A
@Service
mengutip dokumentasi musim semi,Jika Anda melihat desain yang digerakkan oleh domain oleh eric evans,
dan
Repository
sesuai Eric Evans,sumber
Di sini ada jawaban yang cukup baik untuk menjelaskan penjelasan whats-the-difference-between-repository-service-annotation. Saya ingin membagikan perbedaannya
@Controller & @RestController
@Controller
vs.RestController
@RestController
:@Controller
yang ditambahkan@Controller
dan@ResponseBody
anotasi secara otomatis. jadi kami tidak perlu menambahkan@ResponseBody
metode pemetaan kami. Itu berarti@ResponseBody
default aktif.@RestController
Anda tidak dapat mengembalikan tampilan (Dengan menggunakanViewresolver
di Spring / Spring-Boot)@RestController
juga mengubah responsJSON/XML automatically
sebagai@ResponseBody
membuat objek yang dikembalikan ke sesuatu yang bisa di dalam tubuh,e.g. JSON or XML
@Controller
@Controller
digunakan untuk menandai kelas sebagai Spring MVC Controller. Anotasi ini hanya versi khusus@Component
dan memungkinkan kelas pengontrol dideteksi secara otomatis berdasarkan pemindaian classpath.@Controller
Anda dapat mengembalikan tampilan di MVC web Spring.Tampilan Lebih Detail
sumber
Repositori dan Layanan adalah anak-anak anotasi Komponen . Jadi, semuanya adalah Komponen . Repositori dan Layanan hanya perluas saja. Bagaimana sebenarnya? Layanan hanya memiliki perbedaan ideologis: kami menggunakannya untuk layanan. Repositori memiliki handler pengecualian khusus.
sumber
Penjelasan stereotip:
@Service
- Beri catatan semua kelas layanan Anda dengan @Service. Lapisan ini tahu satuan kerja. Semua logika bisnis Anda akan berada di kelas Layanan. Secara umum metode lapisan layanan dicakup dalam transaksi. Anda dapat membuat beberapa panggilan DAO dari metode layanan, jika satu transaksi gagal, semua transaksi harus dikembalikan.@Repository
- Buat anotasi semua kelas DAO Anda dengan @Repository. Semua logika akses database Anda harus dalam kelas DAO.@Component
- Buat anotasi komponen Anda yang lain (misalnya kelas sumber daya REST) dengan stereotip komponen.@Autowired
- Biarkan Spring auto-wire kacang lain ke dalam kelas Anda menggunakan penjelasan @Autowired.@Component
adalah stereotip umum untuk komponen apa pun yang dikelola oleh Pegas.@Repository
,,@Service
dan@Controller
merupakan spesialisasi dari@Component
untuk kasus penggunaan yang lebih spesifik, misalnya, di lapisan persistensi, layanan, dan presentasi, masing-masing.Awalnya dijawab di sini .
sumber
Perbedaan antara @Component, @Repository, @Controller & @Service annotations
@Controller
= @Komponen (Anotasi Internal) + Fitur-fitur lapisan Presentasi@Service
= @Komponen (Anotasi Internal) + Fitur-fitur lapisan Layanan@Component
= Komponen Aktual (Kacang)@Repository
= @Komponen (Anotasi Internal) + Fitur Lapisan Data (digunakan untuk menangani Domain Beans)sumber
Dalam kerangka kerja pegas menyediakan beberapa jenis penjelasan khusus, yang disebut penjelasan stereotip. Ini adalah sebagai berikut: -
penjelasan yang dinyatakan di atas adalah spesial karena ketika kita menambahkan
<context:component-scan>
ke file xxx-servlet.xml, spring akan secara otomatis membuat objek kelas-kelas yang dijelaskan dengan penjelasan di atas selama pembuatan konteks / fase pemuatan.sumber
@Component
,@ Repository
,@ Service
,@Controller
:@Component
adalah stereotip umum untuk komponen yang dikelola oleh musim semi@Repository
,@Service
dan@Controller
yang@Component
spesialisasi untuk menggunakan lebih spesifik:@Repository
untuk kegigihan@Service
untuk layanan dan transaksi@Controller
untuk pengontrol MVCMengapa menggunakan
@Repository
,@Service
,@Controller
lebih@Component
? Kita dapat menandai kelas komponen kita dengan @Component, tetapi jika sebaliknya kita menggunakan alternatif yang menyesuaikan dengan fungsionalitas yang diharapkan. Kelas kami lebih cocok dengan fungsi yang diharapkan dalam setiap kasus tertentu.Kelas yang diberi penjelasan dengan
@Repository
memiliki terjemahan yang lebih baik dan penanganan kesalahan yang dapat dibaca dengan org.springframework.dao.DataAccessException. Ideal untuk menerapkan komponen yang mengakses data (DataAccessObject atau DAO).Kelas beranotasi dengan
@Controller
memainkan peran pengontrol dalam aplikasi Spring Web MVCKelas beranotasi dengan
@Service
memainkan peran dalam layanan logika bisnis, misalnya pola Fasad untuk Manajer DAO (Fasad) dan penanganan transaksisumber
Jawaban yang disajikan di sini sebagian besar benar secara teknis, tetapi meskipun daftar tanggapannya panjang dan ini akan ada di bagian bawah, saya pikir layak untuk menempatkan tanggapan yang benar-benar benar di sini juga, kalau-kalau ada orang yang menemukannya dan belajar sesuatu yang berharga dari Itu. Bukan karena sisa jawaban itu salah, hanya saja mereka tidak benar. Dan, untuk menghentikan gerombolan troll, ya, saya tahu bahwa secara teknis penjelasan ini adalah hal yang sama dan paling dapat dipertukarkan bahkan hingga musim semi 5. Sekarang, untuk jawaban yang tepat:
Ketiga penjelasan ini adalah hal yang sangat berbeda dan tidak dapat dipertukarkan. Anda bisa mengatakannya karena ada tiga, bukan hanya satu. Mereka tidak dimaksudkan untuk dipertukarkan, mereka hanya dilaksanakan dengan cara yang elegan dan nyaman.
Pemrograman modern adalah penemuan, seni, teknik, dan komunikasi, dalam proporsi yang berbeda-beda. Bit komunikasi biasanya sangat penting karena kode biasanya dibaca lebih sering daripada yang tertulis. Sebagai seorang programmer Anda tidak hanya mencoba untuk memecahkan masalah teknis, Anda juga mencoba untuk mengomunikasikan niat Anda kepada programmer masa depan yang membaca kode Anda. Pemrogram ini mungkin tidak membagikan bahasa asli Anda, atau lingkungan sosial Anda, dan ada kemungkinan bahwa mereka mungkin membaca kode Anda 50-tahun di masa depan (itu tidak mungkin seperti yang Anda bayangkan). Sulit untuk berkomunikasi secara efektif sejauh itu di masa depan. Karena itu, sangat penting bagi kita untuk menggunakan bahasa yang paling jelas, paling efisien, benar, dan komunikatif yang tersedia bagi kita.
Sebagai contoh, sangat penting untuk
@Repository
digunakan ketika kita sedang menulis repositori, bukan@Component
. Yang terakhir adalah pilihan anotasi untuk repositori yang sangat buruk karena tidak mengindikasikan bahwa kita sedang melihat repositori. Kita dapat mengasumsikan bahwa repositori juga merupakan spring-bean, tetapi tidak berarti bahwa suatu komponen adalah repositori. Dengan@Repository
kami menjadi jelas dan spesifik dalam bahasa kami. Kami menyatakan dengan jelas bahwa ini adalah repositori. Dengan@Component
kami menyerahkannya kepada pembaca untuk memutuskan jenis komponen apa yang mereka baca, dan mereka harus membaca seluruh kelas (dan mungkin pohon subkelas dan antarmuka) untuk menyimpulkan makna. Kelas kemudian dapat disalahartikan oleh pembaca di masa depan yang jauh sebagai bukan repositori, dan kami akan bertanggung jawab atas kesalahan ini karena kami, yang tahu betul bahwa ini adalah repositori, gagal untuk lebih spesifik dalam bahasa kami. dan mengomunikasikan maksud kami secara efektif.Saya tidak akan membahas contoh-contoh lain, tetapi akan menyatakan sejelas mungkin: penjelasan ini adalah hal yang sangat berbeda dan harus digunakan dengan tepat, sesuai dengan niat mereka.
@Repository
adalah untuk penyimpanan repositori dan tidak ada penjelasan lain yang benar.@Service
untuk layanan dan tidak ada penjelasan lain yang benar.@Component
adalah untuk komponen yang bukan repostories atau layanan, dan menggunakan salah satu dari ini di tempatnya juga akan salah. Mungkin dikompilasi, bahkan mungkin berjalan dan lulus tes Anda, tetapi itu akan salah dan saya akan kurang memikirkan Anda (secara profesional) jika Anda melakukan ini.Ada contoh ini sepanjang musim semi (dan pemrograman pada umumnya). Anda tidak boleh menggunakan
@Controller
saat menulis API REST, karena@RestController
tersedia. Anda tidak boleh menggunakan@RequestMapping
kapan@GetMapping
alternatif yang valid. Dll. Dll. Anda harus memilih bahasa yang tepat dan benar yang paling spesifik untuk mengomunikasikan maksud Anda kepada pembaca Anda, jika tidak, Anda memasukkan risiko ke dalam sistem Anda, dan risiko memiliki biaya.sumber
Untuk menyederhanakan ilustrasi ini, mari kita pertimbangkan teknis dengan use case, Anotasi ini digunakan untuk disuntikkan dan seperti yang saya katakan secara harfiah " Dulu disuntikkan ", itu berarti, jika Anda tahu cara menggunakan Dependency Injection "DI" dan Anda seharusnya, maka Anda akan selalu mencari anotasi ini, dan dengan memberi anotasi pada kelas dengan Jenis Stereo ini , Anda memberi tahu wadah DI untuk memindai mereka agar siap untuk Injeksi di tempat lain, ini adalah target praktis.
Sekarang mari kita pindah ke masing-masing; pertama @Service , Jika Anda sedang membangun beberapa logika untuk kasus bisnis yang spesifik Anda perlu untuk memisahkan yang di tempat yang akan berisi logika bisnis Anda, layanan ini normal Kelas atau Anda dapat menggunakannya sebagai antarmuka jika Anda ingin, dan ditulis seperti ini
Semua adalah cara yang sama ketika Anda menyuntikkan mereka, @Repository itu adalah antarmuka yang menerapkan implementasi untuk pola desain Repositori Pola Repositori , umumnya digunakan ketika Anda berurusan dengan beberapa penyimpanan data atau database, dan Anda akan menemukan bahwa, itu berisi beberapa implementasi siap bagi Anda untuk menangani operasi basis data; dapat berupa CrudRepository , JpaRepository dll.
Akhirnya @Component , ini adalah bentuk umum untuk kacang yang terdaftar di Musim Semi, musim semi itu selalu mencari kacang yang ditandai dengan @Component untuk didaftarkan, kemudian @Service dan @Repository adalah kasus khusus @Component, namun kasus penggunaan umum untuk komponen adalah ketika Anda membuat sesuatu yang murni teknis bukan untuk menutupi kasus bisnis langsung! seperti memformat tanggal atau menyerahkan mekanisme serialisasi permintaan khusus dan sebagainya.
sumber
@Component bertindak sebagai anotasi @Bean di kelas konfigurasi, register bean dalam konteks musim semi. Juga merupakan induk untuk penjelasan @Service, @Repository, dan @Controller.
@Service , memperluas anotasi @Component dan hanya memiliki perbedaan penamaan.
@Repository - memperluas anotasi @Component dan menerjemahkan semua pengecualian basis data ke dalam DataAccessException .
@Controller - bertindak sebagai pengontrol dalam pola MVC. Dispatcher akan memindai kelas beranotasi tersebut untuk metode yang dipetakan, mendeteksi anotasi @RequestMapping.
sumber
Ini semua adalah anotasi StereoType. Ini berguna untuk membuat kelas kita sebagai spring bean dalam wadah ioc,
sumber