Spring的Aware接口你知道多少
若 Spring 檢測到 bean 實現了 Aware 接口,則會為其注入相應的依賴。所以通過讓bean 實現 Aware 接口,則能在 bean 中獲得相應的 Spring 容器資源。
Spring 中提供的 Aware 接口有:
BeanNameAware:注入當前 bean 對應 beanNameBeanClassLoaderAware:注入加載當前 bean 的 ClassLoaderBeanFactoryAware:注入 當前BeanFactory容器 的引用

BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根標記接口。
其使用setter注入來在應用程序上下文啟動期間獲取對象。
Aware接口是回調,監(jiān)聽器和觀察者設計模式的混合,它表示bean有資格通過回調方式被Spring容器通知。
1 BeanNameAware
使對象能夠知道容器中定義的bean名稱。
public class MyBeanName implements BeanNameAware {
@Override
public void setBeanName(String beanName) {
System.out.println(beanName);
}
}
beanName屬性表示在Spring容器中注冊的bean id,在我們的實現中,只是顯示bean名稱。
在Spring配置類中注冊這種類型的bean:
@Configuration
public class Config {
@Bean(name = "myCustomBeanName")
public MyBeanName getMyBeanName() {
return new MyBeanName();
}
}
啟動應用程序上下文并從中獲取bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyBeanName myBeanName = context.getBean(MyBeanName.class);
setBeanName方法打印出了“myCustomBeanName”。
若從@Bean注解中刪除name =“…”代碼,則在這種情況下,將getMyBeanName()方法名稱分配給bean,所以輸出將是“getMyBeanName”。
2 BeanFactoryAware
用于注入BeanFactory對象,就能訪問創(chuàng)建對象的BeanFactory。
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"));
}
}
在setBeanFactory()方法的幫助下,我們將IoC容器中的BeanFactory引用分配給beanFactory屬性。
然后,我們可以像在getMyBeanName()函數中一樣直接使用它。
初始化MyBeanFactory并調用getMyBeanName()方法:
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class); myBeanFactory.getMyBeanName();
由于我們已經在前面的示例中實例化了MyBeanName類,因此Spring將在此處調用現有實例。
3 適用場景
獲取bean名稱以進行日志記錄或埋點,對于BeanFactoryAware,它可以使用擴展代碼中的spring bean。
大多數情況下,應避免使用任何Aware接口,因為實現這些接口會將代碼耦合到Spring框架。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Java并發(fā)編程示例(七):守護線程的創(chuàng)建和運行
這篇文章主要介紹了Java并發(fā)編程示例(七):守護線程的創(chuàng)建和運行,在本節(jié)示例中,我們將創(chuàng)建兩個線程,一個是普通線程,向隊列中寫入事件,另外一個是守護線程,清除隊列中的事件,需要的朋友可以參考下2014-12-12
JPA?@ManyToMany?報錯StackOverflowError的解決
這篇文章主要介紹了JPA?@ManyToMany?報錯StackOverflowError的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
在Java中使用redisTemplate操作緩存的方法示例
這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲String、List、Set、Hash、Zset。感興趣的可以了解一下2019-01-01

