Musim semi @ Anotasi Primer

1. Ikhtisar

Dalam tutorial singkat ini, kita akan membahas anotasi @Primary Spring yang diperkenalkan dengan framework versi 3.0.

Sederhananya, kami menggunakan @Primary untuk memberikan preferensi yang lebih tinggi pada biji ketika ada beberapa biji dengan jenis yang sama.

Mari kita gambarkan masalahnya secara rinci.

2. Mengapa @Primary Dibutuhkan?

Dalam beberapa kasus, kita perlu mendaftarkan lebih dari satu kacang dengan tipe yang sama .

Dalam contoh ini kita memiliki kacang JohnEmployee () dan TonyEmployee () dari jenis Karyawan :

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

Spring menampilkan NoUniqueBeanDefinitionException jika kita mencoba menjalankan aplikasi .

Untuk mengakses kacang dengan tipe yang sama kita biasanya menggunakan anotasi @Qualifier ("beanName") .

Kami menerapkannya di titik injeksi bersama dengan @Autowired . Dalam kasus kami, kami memilih kacang pada fase konfigurasi sehingga @Qualifier tidak dapat diterapkan di sini. Kita dapat mempelajari lebih lanjut tentang anotasi @Qualifier dengan mengikuti tautan.

Untuk mengatasi masalah ini Spring menawarkan anotasi @Primary .

3. Gunakan @Primary With @Bean

Mari kita 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 menandai kacang TonyEmployee () dengan @Primary . Spring akan menyuntikkan kacang TonyEmployee () secara istimewa di atas JohnEmployee () .

Sekarang, mari kita mulai konteks aplikasi dan dapatkan kacang Karyawan darinya:

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

Setelah kami menjalankan aplikasi:

Employee{name='Tony'}

Dari output, kita dapat melihat bahwa instance TonyEmployee () memiliki preferensi saat melakukan autowiring .

4. Gunakan @Primary Dengan @Component

Kita bisa menggunakan @Primary langsung di beannya . Mari kita lihat skenario berikut:

public interface Manager { String getManagerName(); }

Kami memiliki antarmuka Manajer dan dua kacang subclass, 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"; } }

Keduanya mengganti getManagerName () dari antarmuka Manajer . Juga, perhatikan bahwa kami menandai kacang GeneralManager dengan @Primary .

Kali ini, @Primary hanya masuk akal jika kami mengaktifkan pemindaian komponen :

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

Mari buat layanan untuk menggunakan injeksi ketergantungan sambil menemukan kacang yang tepat:

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

Di sini, kacang DepartmentManager dan GeneralManager memenuhi syarat untuk pengiriman otomatis.

Saat kami menandai kacang GeneralManager dengan @Primary , itu akan dipilih untuk injeksi ketergantungan :

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

Outputnya adalah " Manajer umum".

5. Kesimpulan

Dalam artikel ini, kita belajar tentang anotasi @Primary Spring . Dengan contoh kode, kami mendemonstrasikan kebutuhan dan kasus penggunaan @Primary.

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