Anotasi Spring @Qualifier

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menerangkan apa yang dapat dibantu oleh anotasi @Qualifier , masalah yang dapat diselesaikan dan cara menggunakannya.

Kami juga akan menerangkan bagaimana ia berbeza dengan anotasi @Primary dan dari autowiring dengan nama.

2. Keperluan Autowire untuk Disambiguasi

The @Autowired anotasi adalah cara yang baik untuk membuat keperluan untuk menyuntik pergantungan di Spring yang jelas. Dan walaupun ia berguna, terdapat kes penggunaan yang mana anotasi ini sahaja tidak cukup untuk Spring untuk memahami kacang mana yang hendak disuntik.

Secara lalai, Spring menyelesaikan kemasukan autowired mengikut jenis.

Sekiranya terdapat lebih daripada satu biji jenis yang sama di dalam bekas, rangka akan membuang NoUniqueBeanDefinitionException , yang menunjukkan bahawa lebih daripada satu biji tersedia untuk penggunaan automatik.

Mari kita bayangkan keadaan di mana dua calon yang mungkin ada untuk Spring untuk disuntik sebagai kolaborator kacang dalam satu 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; }

Sekiranya kita cuba memuatkan FooService ke dalam konteks kita, kerangka Spring akan membuang NoUniqueBeanDefinitionException . Ini kerana Spring tidak tahu kacang mana yang hendak disuntik . Untuk mengelakkan masalah ini, terdapat beberapa penyelesaian. The @Qualifier anotasi adalah salah seorang daripada mereka.

3. Anotasi @ Kelayakan

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

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

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

Dengan memasukkan anotasi @Qualifier bersama dengan nama pelaksanaan tertentu yang ingin kita gunakan - dalam contoh ini, Foo - kita dapat mengelakkan kekaburan ketika Spring menjumpai banyak kacang dari jenis yang sama.

Kita perlu mengambil kira bahawa nama kelayakan yang akan digunakan adalah yang dinyatakan dalam anotasi @Component .

Perhatikan bahawa kami juga boleh menggunakan anotasi @Qualifier pada kelas pelaksanaan Formatter , bukannya menentukan nama dalam anotasi @Component mereka , untuk mendapatkan kesan yang sama:

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

4. @ Qualifier vs @Primary

Terdapat anotasi lain yang disebut @Primary yang dapat kita gunakan untuk memutuskan kacang mana yang hendak disuntik ketika kesamaran ada mengenai suntikan ketergantungan.

Anotasi ini menentukan pilihan apabila terdapat banyak kacang dengan jenis yang sama . Kacang yang dikaitkan dengan penjelasan @Primary akan digunakan kecuali dinyatakan sebaliknya.

Mari lihat contoh:

@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-dua kaedah mengembalikan jenis Pekerja yang sama . Kacang yang akan disuntik Spring adalah yang dikembalikan dengan kaedah tonyEm Employee . Ini kerana mengandungi anotasi @Primary . Anotasi ini berguna apabila kita ingin menentukan biji jenis mana yang harus disuntik secara lalai .

Sekiranya kita memerlukan kacang yang lain pada titik suntikan, kita perlu menunjukkannya secara khusus. Kita boleh melakukannya melalui penjelasan @Qualifier . Sebagai contoh, kita dapat menentukan bahawa kita ingin menggunakan kacang yang dikembalikan dengan kaedah johnEm Employee dengan menggunakan anotasi @Qualifier .

Berbaloi dan berkata bahawa jika kedua-dua @Qualifier dan @Primary anotasi yang hadir, maka @Qualifier anotasi akan mempunyai keutamaan. Pada dasarnya, @Primary mendefinisikan lalai, sementara @ Qualifier sangat spesifik.

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

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

Dalam kes ini, anotasi @Primary diletakkan di salah satu kelas pelaksana dan akan melemahkan senario.

5. @ Qualifier vs Autowiring dengan Nama

Kaedah lain untuk menentukan antara banyak kacang ketika melakukan autowiring adalah dengan menggunakan nama ladang untuk menyuntik. Ini adalah lalai sekiranya tidak ada petunjuk lain untuk Spring . Mari lihat beberapa kod berdasarkan contoh awal kami:

public class FooService { @Autowired private Formatter fooFormatter; }

Dalam kes ini, Spring akan menentukan bahawa kacang yang akan disuntik adalah FooFormatter kerana nama medan dipadankan dengan nilai yang kami gunakan dalam anotasi @Component untuk kacang itu.

6. Kesimpulannya

Kami telah menerangkan senario di mana kita perlu membongkar kacang mana yang hendak disuntik. Khususnya, kami menerangkan anotasi @Qualifier dan membandingkannya dengan cara lain yang serupa untuk menentukan kacang mana yang perlu digunakan.

Seperti biasa, kod lengkap untuk artikel ini terdapat di GitHub.