BeanFactoryAware在InitializingBean之后执行,奇怪的Spring初始化顺序?
来源:互联网 发布:战舰世界画面优化设置 编辑:程序博客网 时间:2024/05/13 11:29
网上已经有大把文章介绍bean的生命周期和执行顺序,但是都是针对单个bean的。
今天在项目遇到一个问题:A类实现了BeanFactoryAware接口,将BeanBeanFactory对象保存在自己的static变量中。
public class A implements BeanFactoryAware { private static BeanFactory beanFactory; public static BeanFactory getBeanFactory() { return beanFactory; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("aaa"); A.beanFactory = beanFactory; }}
B类实现了InitializingBean接口,希望获取到BeanBeanFactory对象。
public class B implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("bbbb"); System.out.println(A.getBeanFactory()==null); }}
现在我们来测试下着2个方法的执行顺序:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="net.aty.spring.A"></bean> <bean class="net.aty.spring.B"></bean></beans>
public class MainTst { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "spring.xml");// 加载 spring 配置文件 }}
程序输出如下:
现在我们修改下xml文件,测试java代码不变:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="net.aty.spring.B"></bean><bean class="net.aty.spring.A"></bean></beans>
我们项目恰好使用的是第二种方式,结果就导致空指针了。对于单个bean来说,确实是先执行BeanFactoryAware,后执行InitializingBean。但是对于不同的bean来说,并没有这个顺序保证。上面测试可以看出:先定义的bean先执行。
spring判断bean的依赖关系,无非就是构造注入和set注入,上面的2个A和B并没有显示地依赖关系,虽然逻辑上是B依赖于A,但是spring并不知道这种关系。为了让spring知道这种逻辑上的依赖关系,spring专门提供了depends-on。
0 0
- BeanFactoryAware在InitializingBean之后执行,奇怪的Spring初始化顺序?
- spring中多例、BeanFactoryAware、ApplicationContextAware、InitializingBean接口
- spring InitializingBean init-method postConstruct 执行顺序
- spring InitializingBean init-method postConstruct 执行顺序
- spring InitializingBean init-method postConstruct 执行顺序
- 用spring的InitializingBean的afterPropertiesSet初始化
- 用spring的InitializingBean作初始化
- spring初始化bean InitializingBean
- spring初始化bean InitializingBean
- spring初始化加载InitializingBean
- Spring-Bean的构造函数和Setter执行顺序以及InitializingBean
- SPRING的初始化方法执行先后顺序
- spring的InitializingBean在dubbo中的使用
- 用spring的InitializingBean的afterPropertiesSet来初始化
- 用spring的InitializingBean的afterPropertiesSet来初始化
- 用spring的InitializingBean的afterPropertiesSet来初始化
- 用spring的InitializingBean的afterPropertiesSet来初始化
- 用spring的InitializingBean的afterPropertiesSet来初始化
- Ajax小记
- 04-树6 Complete Binary Search Tree (30分)
- Oracle Trace dbms_monitor
- java.util.Scanner
- linux c 通过内存映射,操作文件
- BeanFactoryAware在InitializingBean之后执行,奇怪的Spring初始化顺序?
- ios中由UITabbar管理的UINavigationController当push的时候隐藏TabBar
- 个人记录-LeetCode 17. Letter Combinations of a Phone Number
- android transitiondrawable基本使用
- 关于多层级树形结构的项目列表
- 母函数训练C题 HDU 1085
- servlet小记
- 【GMT】Ubuntu16.04下安装GMT5.2.1报错non-floating-point argument in call to function __builtin_isnan
- 前行