BeanNameAware dan BeanFactoryAware Antarmuka di Spring

1. Ikhtisar

Dalam tutorial singkat ini, kita akan fokus pada antarmuka BeanNameAware dan BeanFactoryAware , di Spring Framework .

Kami akan menjelaskan setiap antarmuka secara terpisah dengan pro dan kontra penggunaannya.

2. Antarmuka Sadar

Baik BeanNameAware dan BeanFactoryAware termasuk dalam antarmuka penanda root org.springframework.beans.factory.Aware . Ini menggunakan injeksi penyetel untuk mendapatkan objek selama permulaan konteks aplikasi.

The Sadar antarmuka adalah campuran dari callback, pendengar, dan pola desain pengamat . Ini menunjukkan bahwa bean memenuhi syarat untuk diberitahukan oleh wadah Spring melalui metode callback.

3. BeanNameAware

BeanNameAware membuat objek sadar akan nama kacang yang didefinisikan dalam wadah .

Mari kita lihat contohnya:

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

The beanName properti mewakili id kacang terdaftar dalam wadah Spring. Dalam implementasi kami, kami hanya menampilkan nama kacang.

Selanjutnya, 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 menetapkan nama ke kelas MyBeanName kami dengan baris @Bean (name = "myCustomBeanName") .

Sekarang kita dapat memulai konteks aplikasi dan mendapatkan kacang darinya:

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

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

Jika kita menghapus kode name = "…" dari penjelasan @Bean wadah, dalam hal ini, memberikan nama metode getMyBeanName () ke dalam kacang. Jadi, hasilnya adalah "getMyBeanName" .

4. BeanFactoryAware

BeanFactoryAware digunakan untuk menginjeksi objek BeanFactory . Dengan cara ini kita mendapatkan akses ke BeanFactory yang membuat 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 metode setBeanFactory () , kami menetapkan referensi BeanFactory dari container IoC ke properti beanFactory .

Setelah itu, kita bisa menggunakannya langsung seperti di fungsi getMyBeanName () .

Mari kita inisialisasi MyBeanFactory dan memanggil metode getMyBeanName () :

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

Karena kita telah membuat instance kelas MyBeanName di contoh sebelumnya, Spring akan memanggil instance yang ada di sini.

Baris beanFactory.isSingleton ("myCustomBeanName") memverifikasi itu.

5. Kapan Menggunakan?

Kasus penggunaan tipikal untuk BeanNameAware dapat memperoleh nama kacang untuk tujuan logging atau kabel. Untuk BeanFactoryAware, ini bisa menjadi kemampuan untuk menggunakan kacang pegas dari kode warisan.

Dalam kebanyakan kasus, kita harus menghindari penggunaan salah satu antarmuka Aware , kecuali kita membutuhkannya. Menerapkan antarmuka ini akan memasangkan kode ke kerangka Spring.

6. Kesimpulan

Dalam artikel ini, kita belajar tentang antarmuka BeanNameAware dan BeanFactoryAware serta cara menggunakannya dalam praktik.

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