Misalkan saya memiliki antarmuka seperti ini:
interface Country {}
class USA implements Country {}
class UK implements Country ()
Dan cuplikan konfigurasi xml ini:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
Bagaimana cara mengontrol dependensi yang dipasangi otomatis di bawah ini? Saya mau yang Inggris.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Saya menggunakan Spring 3.0.3.RELEASE.
Jawaban:
Ini didokumentasikan di bagian 3.9.3 dari manual Spring 3.0:
Dengan kata lain, perilaku default seolah-olah Anda menambahkan
@Qualifier("country")
ke metode penyetel.sumber
country
)Anda dapat menggunakan anotasi @Qualifier
Dari sini
Menyempurnakan pengiriman otomatis berbasis anotasi dengan kualifikasi
Karena autowiring menurut jenis dapat menghasilkan banyak kandidat, seringkali diperlukan kontrol lebih besar atas proses seleksi. Salah satu cara untuk melakukannya adalah dengan anotasi @Qualifier Spring. Hal ini memungkinkan untuk mengaitkan nilai qualifier dengan argumen tertentu, mempersempit himpunan tipe yang cocok sehingga kacang tertentu dipilih untuk setiap argumen. Dalam kasus yang paling sederhana, ini bisa menjadi nilai deskriptif biasa:
Ini akan menggunakan Inggris menambahkan id ke kacang USA dan menggunakannya jika Anda menginginkan USA.
sumber
Cara lain untuk mendapatkan hasil yang sama adalah dengan menggunakan anotasi @Value:
Dalam kasus ini,
"#{country}
string adalah ekspresi Spring Expression Language (SpEL) yang mengevaluasi kacang bernamacountry
.sumber
Satu lagi solusi dengan menyelesaikan dengan nama:
Ini menggunakan paket javax.annotation , jadi ini bukan khusus Spring, tetapi Spring mendukungnya.
sumber
@Resource
tidak akan keluar-of-the-box dengan java 11 karena modul jigsawdalam beberapa kasus, Anda dapat menggunakan anotasi @Primary.
Dengan cara ini akan dipilih sebagai kandidat autowire default, tanpa perlu kandidat autowire pada kacang lain.
untuk mo deatils lihat Autowiring dua kacang menerapkan antarmuka yang sama - bagaimana mengatur kacang default ke autowire?
sumber