Saya akan melalui beberapa blog di SpringSource dan di salah satu blog, penulis menggunakan @Inject
dan saya kira dia juga bisa menggunakan @Autowired
.
Ini adalah bagian dari kode:
@Inject private CustomerOrderService customerOrderService;
Saya tidak yakin tentang perbedaan antara @Inject
dan @Autowired
akan sangat menghargainya jika seseorang menjelaskan perbedaan mereka dan mana yang harus digunakan dalam situasi apa?
Jawaban:
Dengan asumsi di sini Anda mengacu pada
javax.inject.Inject
anotasi.@Inject
adalah bagian dari standar Java CDI ( Contexts and Dependency Injection ) yang diperkenalkan di Java EE 6 (JSR-299), baca selengkapnya . Spring telah memilih untuk mendukung penggunaan secara@Inject
sinonim dengan@Autowired
anotasi mereka sendiri .Jadi, untuk menjawab pertanyaan Anda,
@Autowired
adalah anotasi Spring sendiri.@Inject
adalah bagian dari teknologi Java baru yang disebut CDI yang mendefinisikan standar untuk injeksi ketergantungan mirip dengan Spring. Dalam aplikasi Spring, kedua anotasi bekerja dengan cara yang sama seperti Spring telah memutuskan untuk mendukung beberapa anotasi JSR-299 selain milik mereka.sumber
@Inject
adalah JSR yang terpisah (JSR-330) dari CDI (JSR-299).@Inject
penjelasan JSR lebih baik daripada menggunakan@Autowired
yang mengunci basis kode Anda dengan spring DI.@Inject
sendiri tidak akan memastikan independensi kerangka kerja. Anda juga perlu mendeklarasikan kacang yang dapat disuntikkan tanpa mekanisme yang tergantung pada kerangka seperti Spring@Component
atauapplication.xml
, tetapi gunakan@Named
dan@Singleton
di tingkat kelas. Tidak tahu apakah ada proyek Musim Semi yang benar-benar menyatakan kacang seperti itu hari ini - Saya bahkan tidak pernah mendengar ada proyek yang bermigrasi dari Musim Semi ke JEE ...Berikut adalah posting blog yang membandingkan
@Resource
,@Inject
dan@Autowired
, dan tampaknya melakukan pekerjaan yang cukup komprehensif.Dari tautan:
Tes 2 dan 7 yang referensi penulis adalah 'injeksi dengan nama bidang' dan 'upaya menyelesaikan kacang menggunakan kualifikasi buruk', masing-masing.
Kesimpulan harus memberi Anda semua informasi yang Anda butuhkan.
sumber
Untuk menangani situasi di mana tidak ada kabel, kacang tersedia dengan
@Autowired
required
atribut yang ditetapkanfalse
.Tetapi ketika menggunakan
@Inject
, antarmuka Penyedia bekerja dengan kacang yang berarti bahwa kacang tidak disuntikkan langsung tetapi dengan Penyedia.sumber
Sebagai Spring 3.0, musim semi menawarkan dukungan untuk JSR-330 penjelasan injeksi ketergantungan (
@Inject
,@Named
,@Singleton
).Ada bagian terpisah dalam dokumentasi Spring tentang mereka, termasuk perbandingan dengan setara Spring mereka.
sumber
Perbedaan utama (diperhatikan saat membaca Spring Documents ) antara
@Autowired
dan@Inject
adalah,@Autowired
memiliki atribut 'wajib' sedangkan @Inject tidak memiliki atribut 'wajib'.sumber
@Autowired(required=false)
.Dalam istilah sederhana, "required
Atribut menunjukkan bahwa properti tidak diperlukan untuk keperluan autowiring, properti diabaikan jika tidak dapat diotomatisasikan."Lebih baik gunakan @Inject sepanjang waktu. Karena itu adalah pendekatan konfigurasi java (disediakan oleh sun) yang membuat aplikasi kita agnostic ke framework. Jadi, jika Anda musim semi juga kelas Anda akan bekerja.
Jika Anda menggunakan @Autowired, itu hanya akan berfungsi dengan pegas karena @Autowired adalah pegas yang menyediakan anotasi.
sumber
@Autowired
anotasi didefinisikan dalam kerangka Spring.@Inject
anotasi adalah anotasi standar, yang didefinisikan dalam standar "Injeksi Ketergantungan untuk Java" (JSR-330) . Pegas (sejak versi 3.0) mendukung model umum injeksi ketergantungan yang didefinisikan dalam JSR-330 standar. ( Kerangka kerja Google Guice dan kerangka kerja Picocontainer juga mendukung model ini).Dengan
@Inject
dapat disuntikkan referensi ke implementasiProvider
antarmuka, yang memungkinkan menyuntikkan referensi yang ditangguhkan.Anotasi
@Inject
dan@Autowired
- adalah analogi yang hampir lengkap. Selain@Autowired
anotasi,@Inject
anotasi dapat digunakan untuk properti, metode, dan konstruktor yang mengikat secara otomatis.Berbeda dengan
@Autowired
anotasi,@Inject
anotasi tidak memilikirequired
atribut. Oleh karena itu, jika dependensi tidak akan ditemukan - akan dilemparkan pengecualian.Ada juga perbedaan dalam klarifikasi sifat pengikatan. Jika ada ambiguitas dalam pemilihan komponen untuk injeksi,
@Named
kualifikasi harus ditambahkan. Dalam situasi yang serupa untuk@Autowired
anotasi akan ditambahkan@Qualifier
kualifikasi (JSR-330 mendefinisikan@Qualifier
anotasi itu sendiri dan melalui anotasi kualifikasi@Named
ini ditentukan).sumber
@Inject
tidak memiliki atribut 'wajib'sumber
Selain yang di atas:
@Autowired
kacang adalah Singleton sedangkan dengan menggunakan JSR 330@Inject
penjelasan itu seperti prototipe Spring .@Inject
.@Inject
.sumber
The
@Inject
penjelasan adalah salah satu koleksi JSR-330 penjelasan. Ini memiliki Pencocokan berdasarkan Jenis, Pencocokan dengan Kualifikasi, Pencocokan dengan jalur eksekusi Nama. Jalur eksekusi ini berlaku untuk penyetel dan injeksi lapangan. Perilaku@Autowired
anotasi sama dengan@Inject
anotasi. Satu-satunya perbedaan adalah@Autowired
penjelasan adalah bagian dari kerangka Spring.@Autowired
anotasi juga memiliki jalur eksekusi di atas. Jadi saya sarankan@Autowired
untuk jawaban Anda.sumber