Anotasi Spring @Primary

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan membincangkan anotasi @Primary Spring yang diperkenalkan dengan kerangka versi 3.0.

Ringkasnya, kami menggunakan @Primary untuk memberi keutamaan yang lebih tinggi kepada kacang apabila terdapat banyak kacang dari jenis yang sama.

Mari kita jelaskan masalahnya secara terperinci.

2. Mengapa @Primary Diperlukan?

Dalam beberapa kes, kita perlu mendaftarkan lebih daripada satu biji jenis yang sama .

Dalam contoh ini kita mempunyai kacang JohnEm Employee () dan TonyEm Employee () dari jenis Employee :

@Configuration public class Config { @Bean public Employee JohnEmployee() { return new Employee("John"); } @Bean public Employee TonyEmployee() { return new Employee("Tony"); } }

Spring melemparkan NoUniqueBeanDefinitionException jika kita cuba menjalankan aplikasi .

Untuk mengakses kacang dengan jenis yang sama, kami biasanya menggunakan anotasi @Qualifier (“beanName”) .

Kami menggunakannya pada titik suntikan bersama dengan @Autowired . Dalam kes kami, kami memilih kacang pada fasa konfigurasi sehingga @ Qualifier tidak dapat digunakan di sini. Kami boleh mengetahui lebih lanjut mengenai penjelasan @Qualifier dengan mengikuti pautan.

Untuk menyelesaikan masalah ini Spring menawarkan anotasi @Primary .

3. Gunakan @Primary With @Bean

Mari lihat kelas konfigurasi:

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

Kami menandakan kacang TonyEm Employee () dengan @Primary . Spring akan menyuntikkan biji TonyEm Employee () lebih baik daripada JohnEm Employee () .

Sekarang, mari mulakan konteks aplikasi dan dapatkan kacang Pekerja daripadanya:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Employee employee = context.getBean(Employee.class); System.out.println(employee);

Selepas kami menjalankan aplikasi:

Employee{name='Tony'}

Dari hasilnya, kita dapat melihat bahawa contoh TonyEm Employee () mempunyai pilihan semasa melakukan autowiring .

4. Gunakan @Primary With @Component

Kita boleh menggunakan @Primary secara langsung pada kacang . Mari lihat senario berikut:

public interface Manager { String getManagerName(); }

Kami mempunyai antara muka Pengurus dan dua kacang subkelas, DepartmentManager :

@Component public class DepartmentManager implements Manager { @Override public String getManagerName() { return "Department manager"; } }

Dan kacang GeneralManager :

@Component @Primary public class GeneralManager implements Manager { @Override public String getManagerName() { return "General manager"; } }

Kedua-dua mereka mengatasi getManagerName () daripada pengurus antara muka. Juga, ambil perhatian bahawa kami menandakan GeneralManager kacang dengan @Primary .

Kali ini, @Primary hanya masuk akal apabila kita mengaktifkan imbasan komponen :

@Configuration @ComponentScan(basePackages="org.baeldung.primary") public class Config { }

Mari buat perkhidmatan untuk menggunakan suntikan ketergantungan sambil mencari kacang yang betul:

@Service public class ManagerService { @Autowired private Manager manager; public Manager getManager() { return manager; } }

Di sini, kedua-dua biji DepartmentManager dan GeneralManager layak untuk autowiring.

Seperti yang kita ditandakan GeneralManager kacang dengan @Primary , ia akan dipilih untuk suntikan pergantungan :

ManagerService service = context.getBean(ManagerService.class); Manager manager = service.getManager(); System.out.println(manager.getManagerName());

Hasilnya adalah " Pengurus am".

5. Kesimpulan

Dalam artikel ini, kami mengetahui tentang anotasi @Primary Spring . Dengan contoh kod, kami menunjukkan keperluan dan kes penggunaan @Primary.

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