从源码可以看出,BeanPostProcessor接口有postProcessBeforeInitializationpostProcessAfterInitialization两个方法
    由于Bean对象实例化与初始化完全是两个过程,也就是说:

    • postProcessBeforeInitialization方法会在Bean实例化和属性设置之后,自定义初始化方法InitializingBean之前被调用,
    • postProcessAfterInitialization方法会在Bean实例化和属性设置之后,自定义初始化方法InitializingBean之后被调用。

    image.png
    Spring自带了BeanPostProcessor接口的很多实现类,例如

    • AutowiredAnnotationBeanPostProcessor用于@Autowired注解的实现,
    • AnnotationAwareAspectJAutoProxyCreator用于Spring AOP的动态代理等等。

    AnnotationAwareAspectJAutoProxyCreator为例,简单说明一下后置处理器是怎样工作的。SpringAOP的实现原理是动态代理,最终放入容器的是代理类的对象,而不是Bean本身的对象,那么Spring是什么时候做到这一步的呢?就是在后置处理器AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInitialization方法中,即Bean对象初始化完成之后,后置处理器会判断该Bean是否注册了切面,若是,则生成代理对象注入到容器中。这一部分的关键代码是在哪儿呢?我们定位到AbstractAutoProxyCreator抽象类中的postProcessAfterInitialization方法处便能看到了,如下所示。
    image.png
    除此之外,我们还可以自定义BeanPostProcessor接口的实现类,在其中写入咱们需要的逻辑。 :::info 自定义BeanPostProcessor ::: 我们创建一个MyBeanPostProcessor类,实现BeanPostProcessor接口,如下所示。

    1. package com.meimeixia.bean;
    2. import org.springframework.beans.BeansException;
    3. import org.springframework.beans.factory.config.BeanPostProcessor;
    4. import org.springframework.stereotype.Component;
    5. /**
    6. * 后置处理器,在初始化前后进行处理工作
    7. * @author liayun
    8. *
    9. */
    10. @Component // 将后置处理器加入到容器中,这样的话,Spring就能让它工作了
    11. public class MyBeanPostProcessor implements BeanPostProcessor {
    12. @Override
    13. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    14. // TODO Auto-generated method stub
    15. System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
    16. return bean;
    17. }
    18. @Override
    19. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    20. // TODO Auto-generated method stub
    21. System.out.println("postProcessAfterInitialization..." + beanName + "=>" + bean);
    22. return bean;
    23. }
    24. }

    接下来,我们应该是要编写测试用例来进行测试了

    1. package com.meimeixia.bean;
    2. import org.springframework.beans.factory.DisposableBean;
    3. import org.springframework.beans.factory.InitializingBean;
    4. import org.springframework.context.annotation.Scope;
    5. import org.springframework.stereotype.Component;
    6. @Component
    7. public class Cat implements InitializingBean, DisposableBean {
    8. public Cat() {
    9. System.out.println("cat constructor...");
    10. }
    11. /**
    12. * 会在容器关闭的时候进行调用
    13. */
    14. @Override
    15. public void destroy() throws Exception {
    16. // TODO Auto-generated method stub
    17. System.out.println("cat destroy...");
    18. }
    19. /**
    20. * 会在bean创建完成,并且属性都赋好值以后进行调用
    21. */
    22. @Override
    23. public void afterPropertiesSet() throws Exception {
    24. // TODO Auto-generated method stub
    25. System.out.println("cat afterPropertiesSet...");
    26. }
    27. }

    将Car注册到容器中

    1. package com.meimeixia.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.ComponentScan;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.context.annotation.Scope;
    6. import com.meimeixia.bean.Car;
    7. @ComponentScan("com.meimeixia.bean")
    8. @Configuration
    9. public class MainConfigOfLifeCycle {
    10. @Bean(initMethod="init", destroyMethod="destroy")
    11. public Car car() {
    12. return new Car();
    13. }
    14. }

    直接运行IOCTest_LifeCycle类中的test01()方法就行,该方法的代码如下所示。

    1. @Test
    2. public void test01() {
    3. // 1. 创建IOC容器
    4. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
    5. System.out.println("容器创建完成");
    6. // 关闭容器
    7. applicationContext.close();
    8. }

    输出的结果信息如下所示,但是我们的MyBeanPostProcessor被默认放在了众多BeanPostProcessor的最后
    image.png
    当然了也可以实现Ordered接口自定义BeanPostProcessor的排序,如下所示。

    1. package com.meimeixia.bean;
    2. import org.springframework.beans.BeansException;
    3. import org.springframework.beans.factory.config.BeanPostProcessor;
    4. import org.springframework.core.Ordered;
    5. import org.springframework.stereotype.Component;
    6. /**
    7. * 后置处理器,在初始化前后进行处理工作
    8. * @author liayun
    9. *
    10. */
    11. @Component // 将后置处理器加入到容器中,这样的话,Spring就能让它工作了
    12. public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
    13. @Override
    14. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    15. // TODO Auto-generated method stub
    16. System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
    17. return bean;
    18. }
    19. @Override
    20. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    21. // TODO Auto-generated method stub
    22. System.out.println("postProcessAfterInitialization..." + beanName + "=>" + bean);
    23. return bean;
    24. }
    25. @Override
    26. public int getOrder() {
    27. // TODO Auto-generated method stub
    28. return 3;
    29. }
    30. }