Spring之BeanNameAware和BeanFactoryAware接口
點選「藍色微信名」可快速關注
1
概述
在本篇文章中,我們将重點關注Spring架構中的BeanNameAware和BeanFactoryAware接口。
我們将分别描述每個接口的使用優缺點。
2
Aware接口
BeanNameAware和BeanFactoryAware都屬于org.springframework.beans.factory.Aware根标記接口。
其使用setter注入來在應用程式上下文啟動期間擷取對象。
Aware接口是回調,監聽器和觀察者設計模式的混合,它表示bean有資格通過回調方式被Spring容器通知。
3
BeanNameAware
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(name =“myCustomBeanName”注解為我們的MyBeanName類明确指定了一個名稱。
現在我們可以啟動應用程式上下文并從中擷取bean:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanName myBeanName = context.getBean(MyBeanName.class);
正如我們所期望的那樣,setBeanName方法列印出“myCustomBeanName”。
如果我們從@Bean注解中删除name =“...”代碼,則在這種情況下,将getMyBeanName()方法名稱配置設定給bean,是以輸出将是“getMyBeanName”。
4
BeanFactoryAware
BeanFactoryAware用于注入BeanFactory對象,這樣我們就可以通路建立對象的BeanFactory。
這是一個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"));
}
}
在setBeanFactory()方法的幫助下,我們将IoC容器中的BeanFactory引用配置設定給beanFactory屬性。
然後,我們可以像在getMyBeanName()函數中一樣直接使用它。
初始化MyBeanFactory并調用getMyBeanName()方法:
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();
由于我們已經在前面的示例中執行個體化了MyBeanName類,是以Spring将在此處調用現有執行個體。
5
何時使用?
BeanNameAware的典型用例可能是擷取bean名稱以進行日志記錄或埋點,對于BeanFactoryAware,它可以使用擴充代碼中的spring bean。
在大多數情況下,我們應該避免使用任何Aware接口,除非我們需要它們,實作這些接口會将代碼耦合到Spring架構。
總結
在這篇文章中,我們了解了BeanNameAware和BeanFactoryAware接口以及如何在實踐中使用它們。