Antara Muka BeanNameAware dan BeanFactoryAware pada Musim Bunga

1. Gambaran keseluruhan

Dalam tutorial ini cepat, kita akan memberi tumpuan kepada BeanNameAware dan BeanFactoryAware antara muka, dalam Rangka Kerja Spring .

Kami akan menerangkan setiap antara muka secara berasingan dengan kebaikan dan keburukan penggunaannya.

2. Antara Muka Sedar

Kedua-dua BeanNameAware dan BeanFactoryAware tergolong dalam antara muka penanda root org.springframework.beans.factory.Aware . Ini menggunakan suntikan setter untuk mendapatkan objek semasa permulaan konteks aplikasi.

Antara muka Aware adalah gabungan corak reka bentuk panggilan balik, pendengar, dan pemerhati . Ini menunjukkan bahawa kacang layak diberitahu oleh wadah Spring melalui kaedah panggilan balik.

3. BeanNameAware

BeanNameAware membuat objek menyedari nama kacang yang ditentukan dalam bekas .

Mari kita lihat contohnya:

public class MyBeanName implements BeanNameAware { @Override public void setBeanName(String beanName) { System.out.println(beanName); } }

Harta beanName mewakili id ​​kacang yang didaftarkan di bekas Spring. Dalam pelaksanaan kami, kami hanya memaparkan nama kacang.

Seterusnya, mari daftarkan kacang jenis ini di kelas konfigurasi Spring:

@Configuration public class Config { @Bean(name = "myCustomBeanName") public MyBeanName getMyBeanName() { return new MyBeanName(); } }

Di sini kami secara eksplisit memberikan nama ke kelas MyBeanName kami dengan baris @Bean (name = “myCustomBeanName”) .

Sekarang kita boleh memulakan konteks aplikasi dan mendapatkan kacang daripadanya:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyBeanName myBeanName = context.getBean(MyBeanName.class);

Seperti yang kita harapkan, kaedah setBeanName mencetak "myCustomBeanName" .

Sekiranya kita membuang kod nama = “…” dari anotasi @Bean , dalam kes ini, berikan nama kaedah getMyBeanName () ke dalam kacang. Jadi output akan menjadi "getMyBeanName" .

4. BeanFactoryAware

BeanFactoryAware digunakan untuk menyuntik objek BeanFactory . Dengan cara ini kita mendapat akses ke BeanFactory yang mencipta objek.

Berikut adalah contoh kelas MyBeanFactory :

public class MyBeanFactory implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public void getMyBeanName() { MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class); System.out.println(beanFactory.isSingleton("myCustomBeanName")); } }

Dengan bantuan kaedah setBeanFactory () , kami memberikan rujukan BeanFactory dari bekas IoC ke harta beanFactory .

Selepas itu, kita dapat menggunakannya secara langsung seperti dalam fungsi getMyBeanName () .

Mari kita mulakan MyBeanFactory dan panggil kaedah getMyBeanName () :

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class); myBeanFactory.getMyBeanName();

Oleh kerana kita telah memberi contoh kelas MyBeanName pada contoh sebelumnya, Spring akan memanggil contoh yang ada di sini.

Garis beanFactory.isSingleton ("myCustomBeanName") mengesahkannya.

5. Bilakah Digunakan?

Kes penggunaan khas untuk BeanNameAware mungkin memperoleh nama kacang untuk tujuan log atau pendawaian. Untuk BeanFactoryAware mungkin kemampuan untuk menggunakan biji kacang dari kod warisan.

Dalam kebanyakan kes, kita harus mengelakkan penggunaan antara muka Aware , kecuali kita memerlukannya. Melaksanakan antara muka ini akan menghubungkan kod dengan rangka Spring.

6. Kesimpulannya

Dalam menulis-up ini, kami belajar tentang BeanNameAware dan BeanFactoryAware antara muka dan bagaimana untuk menggunakan mereka dalam amalan.

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