Anotasi, @Resource ( jsr250 ) atau @Autowired (khusus Musim Semi) manakah yang harus saya gunakan dalam DI?
Saya telah berhasil menggunakan keduanya di masa lalu, @Resource(name="blah")
dan@Autowired @Qualifier("blah")
Naluri saya adalah untuk tetap dengan @Resource
tag karena sudah diratifikasi oleh orang-orang jsr.
Adakah yang punya pemikiran kuat tentang ini?
Jawaban:
Di musim semi pra-3.0 tidak masalah yang mana.
Di musim semi 3.0 ada dukungan untuk anotasi standar ( JSR-330 )
@javax.inject.Inject
- gunakan, dengan kombinasi@Qualifier
. Perhatikan bahwa pegas sekarang juga mendukung@javax.inject.Qualifier
meta-anotasi:Jadi kamu bisa punya
atau
Lalu:
Ini membuat penggunaan nama String menjadi lebih sedikit, yang dapat salah eja dan sulit dipertahankan.
Adapun pertanyaan asli: keduanya, tanpa menentukan atribut apa pun dari penjelasan, lakukan injeksi berdasarkan jenis. Perbedaannya adalah:
@Resource
memungkinkan Anda menentukan nama kacang yang disuntikkan@Autowired
memungkinkan Anda untuk menandainya sebagai tidak wajib.sumber
foo
atau konstruktorSomeBean
denganFoo
param?@Resource
dan@Autowired
, jawaban sebenarnya adalah yang diposting oleh @Iththyo, saya pikir yang ini harus diperbarui.Keduanya
@Autowired
(atau@Inject
) dan@Resource
bekerja sama baiknya. Tetapi ada perbedaan konseptual atau perbedaan makna@Resource
berarti beri saya sumber daya yang dikenal dengan nama . Nama diekstraksi dari nama setter atau bidang beranotasi, atau diambil dari nama-Parameter.@Inject
atau@Autowired
coba menyambungkan komponen lain yang sesuai berdasarkan jenis .Jadi, pada dasarnya ini adalah dua konsep yang sangat berbeda. Sayangnya Implementasi Musim Semi
@Resource
memiliki built-in fallback, yang muncul ketika resolusi dengan nama gagal. Dalam hal ini, itu jatuh kembali ke-@Autowired
jenis resolusi menurut-jenis. Meskipun fallback ini mudah digunakan, IMHO itu menyebabkan banyak kebingungan, karena orang tidak mengetahui perbedaan konseptual dan cenderung menggunakan@Resource
autowiring berbasis tipe.sumber
@Resource
bidang beranotasi, dan nama bidang cocok dengan id kacang dalam wadah, maka Spring akan membuangorg.springframework.beans.factory.BeanNotOfRequiredTypeException
jika tipenya berbeda - ini karena kacang pertama kali dicocokkan dengan nama dalam@Resource
anotasi, bukan menurut jenis. Tetapi jika nama properti tidak cocok dengan nama kacang, maka Spring akan mengirimkannya berdasarkan jenis.@Autowire
tidak bisa dan tidak akan berhasil. Anda harus menggunakannya@Resource
dalam kasus itu.Perbedaan utama adalah,
@Autowired
adalah anotasi pegas. Sedangkan@Resource
ditentukan oleh JSR-250, seperti yang Anda tunjukkan sendiri. Jadi yang terakhir adalah bagian dari Jawa sedangkan yang pertama adalah musim semi khusus.Karenanya, Anda benar dalam menyarankan itu, dalam arti tertentu. Saya menemukan orang menggunakan
@Autowired
dengan@Qualifier
karena lebih kuat. Pindah dari beberapa kerangka kerja ke yang lain dianggap sangat tidak mungkin, jika bukan mitos, terutama dalam kasus Musim Semi.sumber
@Autowired
dengan@Qualifier
benar-benar adalah lebih kuat daripada JSR standar@Resource
penjelasan (memikirkan dependensi opsional misalnya dengan@Autowired(required=false)
. Anda tidak dapat melakukan itu dengan@Resource
)Saya ingin menekankan satu komentar dari @ Jules pada jawaban untuk pertanyaan ini. Komentar tersebut membawa tautan yang bermanfaat: Spring Injection dengan @Resource, @Autowired, dan @Inject . Saya mendorong Anda untuk membacanya seluruhnya, namun berikut ini ringkasan singkat kegunaannya:
Bagaimana penjelasan memilih implementasi yang tepat?
@Autowired
dan@Inject
@Resource
Anotasi (atau kombinasi) mana yang harus saya gunakan untuk menyuntikkan kacang saya?
Beri nama komponen Anda secara eksplisit [@Component ("beanName")]
Gunakan
@Resource
denganname
atribut [@Resource (name = "beanName")]Mengapa saya tidak menggunakannya
@Qualifier
?Hindari
@Qualifier
anotasi kecuali Anda ingin membuat daftar kacang yang serupa. Misalnya, Anda mungkin ingin menandai serangkaian aturan dengan@Qualifier
anotasi tertentu . Pendekatan ini membuatnya mudah untuk menyuntikkan sekelompok kelas aturan ke dalam daftar yang dapat digunakan untuk memproses data.Apakah injeksi kacang memperlambat program saya?
Pindai paket spesifik untuk komponen
[context:component-scan base-package="com.sourceallies.person"]
. Meskipun ini akan menghasilkan lebih banyakcomponent-scan
konfigurasi, ini mengurangi kemungkinan Anda akan menambahkan komponen yang tidak perlu ke konteks Musim Semi Anda.Referensi: Pegas Injeksi dengan @Resource, @Autowired dan @Inject
sumber
Ini yang saya dapat dari Manual Referensi Spring 3.0.x : -
sumber
@Autowired + @Qualifier hanya akan berfungsi dengan spring DI, jika Anda ingin menggunakan beberapa DI lain di masa depan @Resource adalah pilihan yang baik.
Perbedaan lain yang saya temukan sangat signifikan adalah @Qualifier tidak mendukung pengkabelan kacang dinamis, karena @Qualifier tidak mendukung placeholder, sementara @Resource melakukannya dengan sangat baik.
Misalnya: jika Anda memiliki antarmuka dengan banyak implementasi seperti ini
dengan @Autowired & @Qualifier Anda perlu mengatur implementasi anak tertentu seperti
yang tidak menyediakan placeholder sementara dengan @Resource Anda dapat menempatkan placeholder dan menggunakan file properti untuk menyuntikkan implementasi anak seperti
di mana service.name diatur dalam file properti sebagai
Semoga itu bisa membantu seseorang :)
sumber
Keduanya sama-sama bagus. Keuntungan menggunakan Sumber Daya adalah di masa depan jika Anda ingin kerangka kerja DI lain selain pegas, perubahan kode Anda akan jauh lebih sederhana. Menggunakan Autowired kode Anda sangat erat dengan mata air DI.
sumber
Ketika Anda menganalisis secara kritis dari kelas dasar dari dua penjelasan ini. Anda akan menyadari perbedaan berikut.
@Autowired
gunakanAutowiredAnnotationBeanPostProcessor
untuk menyuntikkan dependensi.@Resource
gunakanCommonAnnotationBeanPostProcessor
untuk menyuntikkan dependensi.Meskipun mereka menggunakan kelas post processor yang berbeda, mereka semua berperilaku hampir identik. Perbedaannya terletak pada jalur eksekusi mereka, yang telah saya soroti di bawah ini.
1.Matches menurut Tipe
2.Restitions oleh Kualifier
3.Matches oleh Nama
1.Matches by Name
2.Matches by Type
3.Restitions by Qualifiers (diabaikan jika kecocokan ditemukan berdasarkan nama)
sumber
Dengan
@Resource
Anda dapat melakukan injeksi mandiri kacang, mungkin diperlukan untuk menjalankan semua logika tambahan yang ditambahkan oleh prosesor pos kacang seperti hal-hal yang terkait dengan transaksi atau keamanan.Dengan Spring 4.3+
@Autowired
juga mampu melakukan ini.sumber
@Resource
sering digunakan oleh objek tingkat tinggi, didefinisikan melalui JNDI.@Autowired
atau@Inject
akan digunakan oleh kacang yang lebih umum.Sejauh yang saya tahu, itu bukan spesifikasi, atau bahkan konvensi. Ini lebih logis cara kode standar akan menggunakan anotasi ini.
sumber
Sebagai catatan di sini:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
danSpringBeanAutowiringSupport.processInjectionBasedOnServletContext
JANGAN bekerja dengan@Resource
anotasi. Jadi ada perbedaan.sumber