Spring 扩展点系列:
本篇我们来看看 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() 方法前被注入。
小结一下:
--> bean 初始化(setter)
--> BeanNameAware#setBeanName()
--> BeanFactoryAware#setBeanFactory()
--> ApplicationContextAware#setApplicationContext()
--> InitialingBean#afterPropertiesSet()
--> bean 使用
--> bean 销毁(容器关闭)
--> DisposableBean#detroy()
本文标题:【Spring】扩展点(二):BeanNameAware、ApplicationContextAware、BeanFactoryAware
本文链接:https://blog.quwenai.cn/post/10130.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。








还没有评论,来说两句吧...