上图是BeanPostProcessor 的两个接口的调用时机
下面我们来分析一下通过BeanFactory作为容器实例化bean及bean后处理器的执行时机:
- bean调用相应的构造函数,一般是空构造函数(该bean依赖的其他bean也调用自己的构造函数)
- Spring执行依赖关系注入(也就是根据spring自动调用setter方法)
- postProcessBeforeInitialization回调
- 执行初始化方法(配置接口实现afterPropertiesSet…或直接在xml中配置init-method方法)
- postProcessAfterInitialization回调
- 完成bean的实例化也就是现在我们 通过ctx.getbean(beanId)得到了我们需要的bean
//CLASSPATH路径下的bean.xml文件创建Resource对象
ClassPathResource isr = new ClassPathResource("applicationContext.xml");
//以Resource对象作为参数,创建BeanFactory的实例
XmlBeanFactory factory = new XmlBeanFactory(isr);
//获取Bean后处理器实例
MyBeanPostProcessor prr = factory.getBean("beanPostProcessor"
, MyBeanPostProcessor.class);
//注册BeanPostProcessor实例
factory.addBeanPostProcessor(prr);
System.out.println("=============程序已经实例化BeanFactory...");
Person p = factory.getBean("chinese" , Person.class);
System.out.println("=============程序中已经完成了chinese bean的实例化...");
p.useAxe();
输出:
=============程序已经实例化BeanFactory...
Spring实例化主调bean:Chinese实例...
Spring实例化依赖bean:SteelAxe实例...
Bean后处理器在初始化之前对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Bean后处理器在初始化之后对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...依赖注入的值
Bean后处理器在初始化之前对chinese进行增强处理...@@@@@@@@@@@@@@@
正在执行初始化方法 afterPropertiesSet...
正在执行初始化方法 init...
Bean后处理器在初始化之后对chinese进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...Struts 2权威指南
=============程序中已经完成了chinese bean的实例化...
Struts 2权威指南钢斧砍柴真快
我们再来分析一下通过ApplicationContext(BeanFactory的子接口,用它就不用手动注册BeanPostProcessor)作为容器实例化bean及bean后处理器的执行时机:
- 实例化该bean依赖的bean(调用构造方法)
- 调用该bean的构造方法
- Spring执行依赖关系注入
- 执行初始化方法(配置接口实现afterPropertiesSet…或直接在xml中配置init-method方法)
- postProcessAfterInitialization回调
- 完成bean的实例化也就是现在我们 通过ctx.getbean(beanId)得到了我们需要的bean
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("=============程序已经实例化BeanFactory...");
Person p = ctx.getBean("chinese" , Person.class);
System.out.println("=============程序中已经完成了chinese bean的实例化...");
p.useAxe();
输出:
Spring实例化依赖bean:SteelAxe实例...
Bean后处理器在初始化之前对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Bean后处理器在初始化之后对steelAxe进行增强处理...@@@@@@@@@@@@@@@
Spring实例化主调bean:Chinese实例...
Spring执行依赖关系注入...依赖注入的值
Bean后处理器在初始化之前对chinese进行增强处理...@@@@@@@@@@@@@@@
正在执行初始化方法 afterPropertiesSet...
正在执行初始化方法 init...
Bean后处理器在初始化之后对chinese进行增强处理...@@@@@@@@@@@@@@@
Spring执行依赖关系注入...Struts 2权威指南
=============程序已经实例化BeanFactory...
=============程序中已经完成了chinese bean的实例化...
Struts 2权威指南钢斧砍柴真快