TL; DR
@Autowired annotation membuat Anda perlu melakukan pengkabelan sendiri dalam file XML (atau cara lain) dan hanya menemukan bagi Anda apa yang perlu disuntikkan di mana, dan melakukannya untuk Anda.
Penjelasan lengkap
The @Autowired
penjelasan memungkinkan Anda untuk melewatkan konfigurasi tempat lain apa untuk menyuntikkan dan hanya melakukannya untuk Anda. Dengan asumsi paket com.mycompany.movies
Anda adalah Anda harus meletakkan tag ini di XML (file konteks aplikasi) Anda:
<context:component-scan base-package="com.mycompany.movies" />
Tag ini akan melakukan pemindaian otomatis. Dengan asumsi setiap kelas yang harus menjadi kacang diberi penjelasan dengan penjelasan yang benar seperti @Component
(untuk kacang sederhana) atau @Controller
(untuk kontrol servlet) atau @Repository
(untuk DAO
kelas) dan kelas-kelas ini berada di suatu tempat di bawah paket com.mycompany.movies
, Spring akan menemukan semua ini dan membuat kacang untuk masing-masing. Ini dilakukan dalam 2 pemindaian kelas - pertama kali hanya mencari kelas yang perlu menjadi kacang dan memetakan injeksi yang perlu dilakukan, dan pada pemindaian kedua itu menyuntikkan kacang. Tentu saja, Anda dapat mendefinisikan kacang Anda dalam file XML yang lebih tradisional atau dengan kelas @Configuration (atau kombinasi ketiganya).
The @Autowired
penjelasan mengatakan musim semi di mana suntikan perlu terjadi. Jika Anda menaruhnya di atas metode, setMovieFinder
ia memahami (dengan awalan set
+ @Autowired
penjelasan) bahwa kacang perlu disuntikkan. Dalam pemindaian kedua, Spring mencari kacang jenis MovieFinder
, dan jika menemukan kacang seperti itu, ia menyuntikkannya ke metode ini. Jika menemukan dua kacang seperti itu, Anda akan mendapatkan Exception
. Untuk menghindarinya Exception
, Anda dapat menggunakan @Qualifier
anotasi dan memberi tahu yang mana dari kedua kacang yang akan disuntikkan dengan cara berikut:
@Qualifier("redBean")
class Red implements Color {
// Class code here
}
@Qualifier("blueBean")
class Blue implements Color {
// Class code here
}
Atau jika Anda lebih suka menyatakan kacang di XML Anda, itu akan terlihat seperti ini:
<bean id="redBean" class="com.mycompany.movies.Red"/>
<bean id="blueBean" class="com.mycompany.movies.Blue"/>
Dalam @Autowired
deklarasi, Anda juga perlu menambahkan @Qualifier
untuk memberi tahu yang mana dari dua kacang warna yang akan disuntikkan:
@Autowired
@Qualifier("redBean")
public void setColor(Color color) {
this.color = color;
}
Jika Anda tidak ingin menggunakan dua anotasi ( @Autowired
dan @Qualifier
) Anda dapat menggunakan @Resource
untuk menggabungkan keduanya:
@Resource(name="redBean")
public void setColor(Color color) {
this.color = color;
}
The @Resource
(Anda dapat membaca beberapa data tambahan tentang hal itu di komentar pertama pada jawaban ini) suku cadang Anda menggunakan dua penjelasan dan sebagai gantinya Anda hanya menggunakan satu.
Saya hanya akan menambahkan dua komentar lagi:
- Praktik yang baik akan digunakan
@Inject
bukan @Autowired
karena tidak spesifik Musim Semi dan merupakan bagian dari JSR-330
standar .
- Praktik bagus lainnya adalah meletakkan
@Inject
/ @Autowired
pada konstruktor alih-alih metode. Jika Anda meletakkannya di konstruktor, Anda dapat memvalidasi bahwa kacang yang disuntikkan tidak nol dan gagal cepat ketika Anda mencoba memulai aplikasi dan menghindari NullPointerException
ketika Anda benar-benar harus menggunakan kacang.
Pembaruan : Untuk melengkapi gambar, saya membuat pertanyaan baru tentang @Configuration
kelas.