一、整体流程
1、实例化BeanPostFactoryProcessor
2、执行BeanPostFactoryProcessor 的 postProcessorBeanFactory
3、实例化BeanPostProcessor
4、实例化InstantiationAwareBeanPostProcessor
5、执行InstantiationAwareBeanPostProcessor 的 PostProcessorBeforeInstantiation
6、执行bean的构造方法
7、执行InstantiationAwareBeanPostProcessor 的 postProcessorPropertyValues
8、bean 属性注入
9、执行BeanNameAware的setBeanName
10、执行BeanFactoryAware的setBeanFactory
11、执行BeanPostProcessor的PostProcessorBeforInstantiation
12、执行InitializingBean的afterPropertisSet
13、执行<bean> 的init-methord
14执行postBeanProecssor的PostProcessorAfterInitantiation
15、容器初始化完成后,执行调用方法
16、执行diposibleBean 的destroy方法
17、执行<bean>的destroy_method方法
二、各个方法
1、Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。同时可以定义多个BeanFactoryPostProcessor,通过设置'order'属性来确定各个BeanFactoryPostProcessor执行顺序。
注册一个BeanFactoryPostProcessor实例需要定义一个Java类来实现BeanFactoryPostProcessor接口,并重写该接口的postProcessorBeanFactory方法。通过beanFactory可以获取bean的定义信息,并可以修改bean的定义信息。这点是和BeanPostProcessor最大区别
2、 如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。
BeanPostProcessor接口中有2个方法
(1).Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
(2).Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
由API可以看出: 1:后置处理器的postProcessorBeforeInitailization方法是在bean实例化,依赖注入之后及自定义初始化方法(例如:配置文件中bean标签添加init-method属性指定Java类中初始化方法、 @PostConstruct注解指定初始化方法,Java类实现InitailztingBean接口)之前调用 2:后置处理器的postProcessorAfterInitailization方法是在bean实例化、依赖注入及自定义初始化方法之后调用
3、InstantiationAwareBeanPostProcessor中除了上述的两个方法外还有本身接口的方法
(1).Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
(2).boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
(3).PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
throws BeansException;
postProcessBeforeInstantiation方法
这个方法在bean实例化之前被调用,返回的对象可能是代替了目标对象的代理对象,有效的阻止了目标bean默认的实例化。也就是说,如果该方法返回的是non-null
对象 ,这个bean的创建过程就会被短路,就不会执行postProcessAfterInitialization
的方法和postProcessPropertyValues
方法; 相反的如果方法返回值为null,则会继续默认的bean的实例化过程。
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法如果返回不为空,整个对象的创建的过程就结束了,否则会执行这个bean正常的实例化过程
postProcessAfterInstantiation方法
这个方法在bean实例化(通过构造函数或者是工厂方法[via a constructor or factory method
])之后被调用,但是在bean属性注入(property population
)之前,如果方法返回值为true,则说明会在这个bean设置属性方法,即调用postProcessPropertyValues
方法。返回false,则会跳过对象bean属性设置过程。一般的,实现类需要返回true,如果返回false,也阻止了其他InstantiationAwareBeanPostProcessor
子类作用在bean的影响
postProcessPropertyValues方法
这个方法通常是给目标bean设值,这个过程发生只有在postProcessAfterInstantiation方法的结果返回true才会被执行