Saya mengerti bahwa @Component
anotasi diperkenalkan pada musim semi 2.5 untuk menghilangkan definisi xml bean dengan menggunakan pemindaian classpath.
@Bean
diperkenalkan di musim semi 3.0 dan dapat digunakan dengan @Configuration
untuk sepenuhnya menyingkirkan file xml dan menggunakan konfigurasi java sebagai gantinya.
Apakah mungkin menggunakan kembali @Component
anotasi alih-alih memperkenalkan @Bean
anotasi? Pemahaman saya adalah bahwa tujuan akhirnya adalah membuat kacang di kedua kasus.
java
spring
annotations
autowired
pengguna1396576
sumber
sumber
@Component
,@Repository
&@Service
anotasi di Spring?Lite mode
. Dan itu tidak dianjurkan. Lihat di sini: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
mengembalikan contoh kacang musim semi yang dapat dikustomisasi, sementara@component
mendefinisikan kelas yang mungkin kemudian dimunculkan oleh mesin pegas IoC bila diperlukan.Jawaban:
@Component
dan@Bean
melakukan dua hal yang sangat berbeda, dan tidak boleh bingung.@Component
(dan@Service
dan@Repository
) digunakan untuk mendeteksi dan mengkonfigurasi kacang secara otomatis menggunakan pemindaian classpath. Ada pemetaan satu-ke-satu implisit antara kelas beranotasi dan kacang (yaitu satu kacang per kelas). Kontrol kabel sangat terbatas dengan pendekatan ini, karena ini murni deklaratif.@Bean
digunakan untuk secara eksplisit mendeklarasikan kacang tunggal, daripada membiarkan Spring melakukannya secara otomatis seperti di atas. Ini memisahkan deklarasi kacang dari definisi kelas, dan memungkinkan Anda membuat dan mengkonfigurasi kacang persis seperti yang Anda pilih.Untuk menjawab pertanyaan Anda ...
Tentu, mungkin; tetapi mereka memilih untuk tidak, karena keduanya sangat berbeda. Mata air sudah cukup membingungkan tanpa membuat air semakin berlumpur.
sumber
@Component
ketika autowired diperlukan? Tampaknya@Bean
tidak dapat mempengaruhi@Autowired
@Autowired
dengan@Bean
jika Anda memiliki anotasi kelas kacang Anda dengan@Configuration
@Component Lebih disukai untuk pemindaian komponen dan kabel otomatis.
Kapan sebaiknya Anda menggunakan @Bean ?
Terkadang konfigurasi otomatis bukanlah suatu pilihan. Kapan? Mari kita bayangkan bahwa Anda ingin mengirim komponen dari pustaka pihak ketiga (Anda tidak memiliki kode sumber sehingga Anda tidak dapat membubuhi keterangan kelasnya dengan @Component), jadi konfigurasi otomatis tidak dimungkinkan.
The @Bean penjelasan mengembalikan sebuah objek yang semi harus mendaftar sebagai kacang dalam konteks aplikasi. The tubuh metode beruang logika bertanggung jawab untuk menciptakan instance.
sumber
@Component
berjalan di kelas sendiri saat@Bean
melanjutkan metode kelas (yang menghasilkan contoh objek kelas).Mari pertimbangkan saya ingin implementasi spesifik tergantung pada beberapa keadaan dinamis.
@Bean
sangat cocok untuk kasus itu.Namun tidak ada cara untuk melakukannya
@Component
.sumber
@Configuration
sumber
Kedua pendekatan bertujuan untuk mendaftarkan tipe target dalam wadah Spring.
Perbedaannya adalah yang
@Bean
berlaku untuk metode , sedangkan@Component
berlaku untuk tipe .Oleh karena itu ketika Anda menggunakan
@Bean
anotasi, Anda mengontrol logika pembuatan instance dalam tubuh metode (lihat contoh di atas ). Dengan@Component
anotasi Anda tidak bisa.sumber
Saya melihat banyak jawaban dan hampir di mana-mana yang disebutkan @Component adalah untuk autowiring di mana komponen dipindai dan @Bean persis menyatakan kacang itu untuk digunakan secara berbeda. Mari saya tunjukkan betapa berbedanya.
Pertama, ini merupakan penjelasan tingkat metode. Kedua Anda biasanya menggunakan untuk mengkonfigurasi kacang dalam kode java (jika Anda tidak menggunakan konfigurasi xml) dan kemudian memanggilnya dari kelas menggunakan metode getBean ApplicationContext. Suka
Ini adalah cara umum untuk membuat anotasi kacang dan bukan kacang khusus. Anotasi tingkat kelas dan digunakan untuk menghindari semua hal konfigurasi melalui konfigurasi java atau xml.
Kami mendapatkan sesuatu seperti ini.
Itu dia . Itu baru saja diperkenalkan untuk menghindari semua langkah konfigurasi untuk instantiate dan menggunakan kacang itu.
sumber
@Bean
pendekatan. Anda masih bisa menggunakan@Autowire
untuk mendapatkan kacang seperti yang akan Anda lakukan jika@Component
.@Bean
hanya menambahkan Bean ke Spring Container seperti@Component
halnya. Perbedaannya adalah sebagai berikut. 1. Menggunakan@Bean
, Anda bisa menambahkan Kelas Pihak Ketiga ke Spring Container. 2. Menggunakan@Bean
, Anda bisa mendapatkan implementasi antarmuka yang diinginkan saat run-time (Menggunakan pola desain pabrik)Anda bisa menggunakan
@Bean
untuk membuat kelas pihak ketiga yang ada tersedia untuk konteks aplikasi kerangka kerja Spring Anda.Dengan menggunakan
@Bean
anotasi, Anda bisa membungkus kelas pihak ketiga (mungkin tidak memiliki@Component
dan mungkin tidak menggunakan Spring), sebagai kacang Spring. Dan kemudian setelah dibungkus menggunakan@Bean
, itu sebagai objek tunggal dan tersedia dalam konteks aplikasi kerangka kerja Spring Anda. Anda sekarang dapat dengan mudah membagikan / menggunakan kembali kacang ini di aplikasi Anda menggunakan injeksi ketergantungan dan@Autowired
.Jadi pikirkan
@Bean
anotasi itu adalah pembungkus / adaptor untuk kelas pihak ketiga. Anda ingin membuat kelas pihak ketiga tersedia untuk konteks aplikasi kerangka kerja Spring Anda.Dengan menggunakan
@Bean
kode di atas, saya secara eksplisit mendeklarasikan kacang tunggal karena di dalam metode ini, saya secara eksplisit membuat objek menggunakannew
kata kunci. Saya juga secara manual memanggil metode setter dari kelas yang diberikan. Jadi saya bisa mengubah nilai bidang awalan. Jadi pekerjaan manual ini disebut sebagai penciptaan eksplisit. Jika saya menggunakan@Component
untuk kelas yang sama, kacang yang terdaftar di wadah Spring akan memiliki nilai default untuk bidang awalan.Di sisi lain, ketika kita membubuhi keterangan kelas dengan
@Component
, tidak perlu bagi kita untuk menggunakannew
kata kunci secara manual . Ini ditangani secara otomatis oleh Spring.sumber
Ketika Anda menggunakan
@Component
tag, itu sama dengan memiliki POJO (Plain Old Java Object) dengan metode deklarasi vanilla bean (dijelaskan dengan@Bean
). Misalnya, metode 1 dan 2 berikut ini akan memberikan hasil yang sama.Metode 1
dengan kacang untuk 'theNumber':
Metode 2
dengan kacang untuk keduanya:
Metode 2 memungkinkan Anda untuk menjaga pernyataan kacang bersama-sama, itu sedikit lebih fleksibel dll. Anda bahkan mungkin ingin menambahkan kacang SomeClass non-vanilla lain seperti berikut:
sumber
Anda memiliki dua cara untuk menghasilkan kacang. Pertama adalah membuat kelas dengan anotasi
@Component
. Yang lainnya adalah membuat metode dan menjelaskannya dengan@Bean
. Untuk kelas yang berisi metode dengan@Bean
harus dianotasi dengan@Configuration
Setelah Anda menjalankan proyek pegas Anda, kelas dengan@ComponentScan
anotasi akan memindai setiap kelas dengan@Component
di atasnya, dan mengembalikan instance dari kelas ini ke Kontainer Ioc. Hal lain yang@ComponentScan
akan dilakukan adalah menjalankan metode dengan . Anda dapat menulis logika dan mengembalikan objek yang Anda inginkan. Hal lain yang layak untuk disebutkan adalah nama metode dengan adalah nama default bean.@Bean
di atasnya dan mengembalikan objek kembali ke Kontainer Ioc sebagai kacang. Jadi, ketika Anda perlu memutuskan jenis kacang apa yang ingin Anda buat tergantung pada kondisi saat ini, Anda perlu menggunakannya@Bean
@Bean
sumber
sumber
@Bean dibuat untuk menghindari penggabungan pegas dan aturan bisnis Anda dalam waktu kompilasi. Ini berarti Anda dapat menggunakan kembali aturan bisnis Anda dalam kerangka kerja lain seperti PlayFramework atau JEE.
Selain itu, Anda memiliki kontrol total tentang cara membuat kacang, di mana itu tidak cukup instan Spring instan.
Saya menulis posting yang membicarakannya.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
sumber
Perbedaan antara Bean dan Komponen:
sumber
1. Tentang @Component
@Component berfungsi seperti halnya pada @Confonation.
Keduanya menunjukkan bahwa kelas yang dianotasi memiliki satu atau lebih kacang yang harus didaftarkan
Spring-IOC-Container
.Kelas dijelaskan oleh @Component, kami menyebutnya
Component of Spring
. Ini adalah konsep yang mengandung beberapa kacang.Component class
harus dipindai secara otomatis oleh Spring untuk mendaftarkan kacang tersebutcomponent class
.2. Tentang @Bean
@Bean digunakan untuk membubuhi keterangan metode
component-class
(sebagaimana disebutkan di atas). Ini menunjukkan contoh disimpan oleh metode beranotasi perlu didaftarkanSpring-IOC-Container
.3. Kesimpulan
Perbedaan antara keduanya relatif tidak disadari, mereka digunakan dalam
different circumstances
. Penggunaan umum adalah:sumber
Poin tambahan dari jawaban di atas
Katakanlah kita punya modul yang dibagikan di banyak aplikasi dan berisi beberapa layanan. Tidak semua dibutuhkan untuk setiap aplikasi.
Jika menggunakan @Component pada kelas-kelas layanan dan pemindaian komponen dalam aplikasi,
Dalam hal ini, Anda harus menyesuaikan pemfilteran pemindaian komponen atau memberikan konfigurasi yang dapat dijalankan oleh kacang yang tidak digunakan. Kalau tidak, konteks aplikasi tidak akan dimulai.
Dalam hal ini, lebih baik bekerja dengan penjelasan @Bean dan hanya instantiate kacang tersebut,
Jadi, pada dasarnya, gunakan @Bean untuk menambahkan kelas pihak ketiga ke konteksnya. Dan @Component jika ada di dalam aplikasi tunggal Anda.
sumber