文章目录
本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git
1 BeanPostProcessor的使用
BeanPostProcessor是spring提供的一个接口,这个接口提供了两个默认方法,分别是在所有组件初始化前后进行一些处理
看源码,分析这两个方法的执行时机
下面我们就用代码来测试一下,首先我们自定义一个组件实现BeanPostProcessor接口
/**
* @description:
* @author: sukang
* @date: 2020-03-06 12:27
*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
//组件创建并属性赋值之后,初始化函数执行之前执行这个方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization方法执行...");
return bean;
}
//组件创建并属性赋值之后,初始化函数执行之后执行这个方法
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization方法执行...");
return bean;
}
}
写个测试用例
//测试BeanPostProcessor
@Test
public void test3(){
//创建容器
System.out.println("IOC容器创建...");
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
}
运行结果
2 BeanPostProcessor的原理
下面我们看一下源码来分析一下BeanPostProcessor的原理
通过看源码来分析Dog组件创建,赋值和初始化过程
源码已阅读完,用伪代码简单的总结一下BeanPostProcessor的原理
//组件创建之后,对组件进行属性赋值,
populateBean()
initializeBean(){
//遍历容器中的所有BeanPostProcessor,调用他们的postProcessBeforeInitialization()方法
applyBeanPostProcessorsBeforeInitialization()
//初始化组件
invokeInitMethods()
//遍历容器中的所有BeanPostProcessor,调用他们的postProcessAfterInitialization()方法
applyBeanPostProcessorsAfterInitialization()
}
3 spring中提供了一些实现BeanPostProcessor的组件
下面我们简单的看一下ApplicationContextAwareProcessor这个组件
我们就在Dog组件的基础上面实现ApplicationContextAware接口的setApplicationContext()方法,这个方法会在Dog组件初始化之前调用并且将ApplicationContext容器作为参数带给Dog组件,Dog组件就可以使用ApplicationContext容器了。
容器之所以能在组件初始化之前带过来是因为ApplicationContextAwareProcessor这个组件的实现效果,我们看一下这个组件的源码
4 对bean的生命周期进行总结
- bean的生命周期:创建 - 初始化 - 销毁
- 通过@Bean(initMethod = “init”, destroyMethod = “destroy”)可以自定义初始化和销毁方法
- 通过InitializingBean&DisposableBean&@PostConstruct&@PreDestroy也可以自定义初始化和销毁方法
- 最后学习了BeanPostProcessor的使用和原理,这个组件我觉得在spring源码是非常重要的,必须要搞懂