【Spring】擴充套件點(三):BeanNameAware、ApplicationContextAware、BeanFactoryAware
阿新 • • 發佈:2020-12-22
前言:
本篇我們來看看 BeanNameAware、ApplicationContextAware、BeanFactoryAware 這三個擴充套件介面,把它們放在一起寫是因為作用相似(PS:“Aware” 的意思是"感知到的"):
- BeanNameAware 介面只有一個方法 setBeanName()。實現 BeanNameAware 介面的 bean,在 bean 載入的過程中可以獲取到該 bean 的 id。
- ApplicationContextAware 介面只有一個方法 setApplicationContext()。實現 ApplicationContextAware 介面的 bean,可以在 bean 載入的過程中可以獲取到 Spring 的 ApplicationContext,從而能夠獲取任意 bean 及大量 IOC 容器資訊
- BeanFactoryAware 介面只有一個方法 setBeanFactory()。實現 BeanFactoryAware 介面的 bean,可以在 bean 載入的過程中可以獲取到載入該 bean 的 BeanFactory
public interface BeanNameAware extends Aware {
void setBeanName(String name);
}
public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
public interface BeanFactoryAware extends Aware {
void setBeanFactory (BeanFactory beanFactory) throws BeansException;
}
下面來看一個示例…
1)寫一個 bean,實現這三個介面
public class TestBean02 implements BeanNameAware, ApplicationContextAware, BeanFactoryAware{
@Override
public void setBeanName(String name) {
System.out.println("setBeanName()...beanName=" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext()...applicationContext=" + applicationContext);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory()...beanFactory=" + beanFactory);
}
}
2)配置 applicationContext.xml
<bean id="bean02" class="com.xupt.yzh.pkg_04.TestBean02"></bean>
3)測試程式碼:
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
=> 執行結果如下:
PS:如果你的 BeanName、ApplicationContext、BeanFactory 有用,那麼就自己定義一個變數將它們儲存下來;如果沒用,那麼只需要實現setXXX()方法,用一下 Spring 注入進來的引數即可。
問題:如果 bean 還同時實現了 InitializingBean 那麼執行順序如何呢?
1)我們把上面的 bean02 修改一下,實現 InitializingBean 並加上一個屬性及setter
public class TestBean02 implements BeanNameAware, ApplicationContextAware, BeanFactoryAware, InitializingBean {
// 新增一個屬性
// 目的是演示bean初始化時機
private String name;
public void setName(String name) {
this.name = name;
System.out.println("setName()..." + name);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet()...");
}
@Override
public void setBeanName(String name) {
System.out.println("setBeanName()...beanName=" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext()...applicationContext=" + applicationContext);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory()...beanFactory=" + beanFactory);
}
}
2)修改 applicationContext.xml 給 bean02 新增一個 name 值
<bean id="bean02" class="com.xupt.yzh.pkg_04.TestBean02">
<property name="name" value="老八"></property>
</bean>
=> 再次啟動容器,執行結果如下
即如果 bean 同時還實現了 InitializingBean,容器會保證 BeanName、ApplicationContext 和 BeanFactory 在呼叫 afterPropertiesSet() 方法前被注入。