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.