Spring注解驱动开发之BeanPostProcessor后置处理器

本文深入探讨Spring框架中的BeanPostProcessor后置处理器,解释其实现原理,并通过自定义处理器进行实战演示,包括接口源码分析、自定义处理器创建与测试,展示其在初始化过程中的作用。
摘要由CSDN通过智能技术生成

1. 前言

BeanPostProcessor 后置处理器可用于 bean 初始化前后进行逻辑增强。Spring 提供了 BeanPostProcessor 接口的很多实现类,例如 AutowiredAnnotationBeanPostProcessor 用于 @Autowired 注解的实现,AnnotationAwareAspectJAutoProxyCreator 用于 Spring AOP 的动态代理等等

它有力的支撑了 Spring AOP 的实现,所以了解学习 BeanPostProcessor 接口非常有必要

2. BeanPostProcessor 接口

2.1. BeanPostProcessor 的源码

public interface BeanPostProcessor {

	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
}
  • postProcessBeforeInitialization()postProcessAfterInitialization() 这两个方法分别是在 Spring 容器中的 bean 初始化前后执行; Spring 容器中的每一个 bean 对象初始化前后,都会执行 BeanPostProcessor 接口的实现类中的这两个方法
  • 也就是说 postProcessBeforeInitialization() 方法会在 bean 实例化和属性填充完成之后,自定义初始化方法之前被调用,而 postProcessAfterInitialization() 方法会在自定义初始化方法之后被调用
  • 当容器中存在多个 BeanPostProcessor 的实现类时,会按照它们在容器中注册的顺序执行

2.2. 自定义 BeanPostProcessor 后置处理器

2.2.1. 实现 BeanPostProcessor 接口

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
        System.out.println("执行了postProcessBeforeInitialization方法......" + beanName + "=>" + bean);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException {
        System.out.println("执行了postProcessAfterInitialization方法......" + beanName + "=>" + bean);
        return bean;
    }
}

2.2.2. 创建实体类

@Component
public class Cat implements InitializingBean, DisposableBean {

    public Cat() {
        System.out.println("执行了Cat的无参构造器............");
    }

    // 实现DisposableBean接口的方法,会在容器关闭的时候进行调用
    @Override
    public void destroy() throws Exception {
        System.out.println("执行了Cat的destroy方法............");
    }

    public void destroyOne() throws Exception {
        System.out.println("执行了Cat的destroyOne方法............");
    }

    // 实现InitializingBean接口的方法,会在bean创建完成,并且属性都赋好值以后进行调用
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行了Cat的afterPropertiesSet方法............");
    }

    public void init() throws Exception {
        System.out.println("执行了Cat的init方法............");
    }
}

2.2.3. 创建配置类

@Configuration
public class IOCLifeCycleConfigOne {

    @Bean(initMethod = "init", destroyMethod = "destroyOne")
    public Cat cat() {
        return new Cat();
    }
}

2.2.4. 测试结果

@SpringBootTest
@RunWith(value = SpringRunner.class)
public class IOCLifeCycleOneTest {

    @Test
    public void test02() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(IOCLifeCycleConfigOne.class);
        Cat cat = (Cat) applicationContext.getBean("cat");
        System.out.println(cat);

        // 关闭容器
        applicationContext.close();
    }
}

test02() 方法测试结果

在这里插入图片描述
自定义后置处理器测试结果

在这里插入图片描述

  • 首先执行无参构造器
  • 由于Cat 类没有属性,所以没有属性填充的日志。故而接下来在初始化方法之前调用了我们自己实现的 postProcessBeforeInitialization() 方法
  • 此时没有 @PostConstruct 注解来指定初始化之前的方法,所以接下来执行实现了 InitializingBean 接口的 afterPropertiesSet() 的自定义初始化方法
  • 再下来就会执行 @Bean 注解所指定的自定义初始化方法
  • 不用多想,初始化方法已完成执行了,再执行 postProcessAfterInitialization() 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值