【spring注解驱动开发】- 生命周期 - BeanPostProcessor的使用和原理

本博客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的生命周期进行总结

发布了78 篇原创文章 · 获赞 32 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/suchahaerkang/article/details/104693346