Anotasi @Qualifier Musim Semi

1. Ikhtisar

Dalam artikel ini, kita akan menjelajahi apa yang dapat dibantu oleh anotasi @Qualifier , masalah apa yang dipecahkan, dan bagaimana menggunakannya.

Kami juga akan menjelaskan perbedaannya dengan anotasi @Primary dan dari autowiring menurut nama.

2. Kebutuhan Autowire untuk Disambiguasi

The @ Autowired penjelasan adalah cara yang bagus untuk membuat kebutuhan untuk menyuntikkan ketergantungan di Spring eksplisit. Dan meskipun berguna, ada kasus penggunaan yang anotasi ini saja tidak cukup bagi Spring untuk memahami kacang mana yang harus disuntikkan.

Secara default, Spring menyelesaikan entri autowired menurut jenisnya.

Jika lebih dari satu kacang dengan jenis yang sama tersedia dalam penampung, kerangka kerja akan menampilkan NoUniqueBeanDefinitionException , yang menunjukkan bahwa lebih dari satu kacang tersedia untuk pemasangan otomatis.

Mari kita bayangkan situasi di mana dua kandidat yang mungkin ada untuk Spring untuk menyuntikkan sebagai kolaborator kacang dalam contoh tertentu:

@Component("fooFormatter") public class FooFormatter implements Formatter { public String format() { return "foo"; } } @Component("barFormatter") public class BarFormatter implements Formatter { public String format() { return "bar"; } } @Component public class FooService { @Autowired private Formatter formatter; }

Jika kita mencoba memuat FooService ke dalam konteks kita, framework Spring akan menampilkan NoUniqueBeanDefinitionException . Ini karena Spring tidak tahu kacang mana yang harus disuntikkan . Untuk menghindari masalah ini, ada beberapa solusi. The @Qualifier penjelasan adalah salah satunya.

3. Anotasi @Qualifier

Dengan menggunakan anotasi @Qualifier , kita dapat menghilangkan masalah kacang mana yang perlu disuntikkan .

Mari kita lihat kembali contoh kita sebelumnya dan lihat bagaimana kita menyelesaikan masalah dengan menyertakan anotasi @Qualifier untuk menunjukkan kacang mana yang ingin kita gunakan:

public class FooService { @Autowired @Qualifier("fooFormatter") private Formatter formatter; }

Dengan menyertakan anotasi @Qualifier bersama dengan nama implementasi spesifik yang ingin kita gunakan - dalam contoh ini, Foo - kita dapat menghindari ambiguitas saat Spring menemukan beberapa kacang dengan tipe yang sama.

Kita perlu mempertimbangkan bahwa nama qualifier yang akan digunakan adalah nama yang dideklarasikan dalam anotasi @Component .

Perhatikan bahwa kita juga dapat menggunakan anotasi @Qualifier pada kelas yang mengimplementasikan Formatter , daripada menentukan nama dalam anotasi @Component , untuk mendapatkan efek yang sama:

@Component @Qualifier("fooFormatter") public class FooFormatter implements Formatter { //... } @Component @Qualifier("barFormatter") public class BarFormatter implements Formatter { //... } 

4. @ @Primualifier vs @Primer

Ada anotasi lain yang disebut @Primary yang dapat kita gunakan untuk memutuskan bean mana yang akan disuntikkan ketika ada ambiguitas terkait injeksi ketergantungan.

Anotasi ini menentukan preferensi saat ada beberapa kacang dengan jenis yang sama . Kacang yang terkait dengan anotasi @Primary akan digunakan kecuali dinyatakan lain.

Mari kita lihat contohnya:

@Configuration public class Config { @Bean public Employee johnEmployee() { return new Employee("John"); } @Bean @Primary public Employee tonyEmployee() { return new Employee("Tony"); } }

Dalam contoh ini, kedua metode mengembalikan jenis Karyawan yang sama . Kacang yang akan disuntikkan Spring adalah yang dikembalikan dengan metode tonyEmployee . Ini karena mengandung anotasi @Primary . Anotasi ini berguna ketika kita ingin menentukan kacang jenis tertentu yang harus dimasukkan secara default .

Dan jika kita membutuhkan biji lain di beberapa titik injeksi, kita perlu menunjukkannya secara khusus. Kita dapat melakukannya melalui anotasi @Qualifier . Misalnya, kita dapat menetapkan bahwa kita ingin menggunakan kacang yang dikembalikan oleh metode johnEmployee dengan menggunakan anotasi @Qualifier .

Itu perlu dicatat bahwa jika kedua @Qualifier dan @Primary penjelasan yang hadir, maka @Qualifier penjelasan akan memiliki didahulukan. Pada dasarnya, @Primary mendefinisikan default, sedangkan @Qualifier sangat spesifik.

Mari kita lihat cara lain menggunakan anotasi @Primary , kali ini menggunakan contoh awal:

@Component @Primary public class FooFormatter implements Formatter { //... } @Component public class BarFormatter implements Formatter { //... } 

Dalam hal ini, anotasi @Primary ditempatkan di salah satu kelas yang mengimplementasikan dan akan membuat skenario tidak ambigu.

5. @Qualifier vs Autowiring menurut Nama

Cara lain untuk memutuskan antara beberapa kacang saat pemasangan otomatis adalah dengan menggunakan nama bidang yang akan diinjeksi. Ini adalah default jika tidak ada petunjuk lain untuk Spring . Mari kita lihat beberapa kode berdasarkan contoh awal kita:

public class FooService { @Autowired private Formatter fooFormatter; }

Dalam hal ini, Spring akan menentukan bahwa kacang yang akan diinjeksi adalah FooFormatter karena nama bidang cocok dengan nilai yang kita gunakan dalam anotasi @Component untuk kacang tersebut.

6. Kesimpulan

Kami telah menjelaskan skenario di mana kami perlu membedakan biji mana yang akan disuntikkan. Secara khusus, kami mendeskripsikan anotasi @Qualifier dan membandingkannya dengan cara serupa lainnya untuk menentukan kacang mana yang perlu digunakan.

Seperti biasa, kode lengkap untuk artikel ini tersedia di GitHub.