spring中的BeanPostProcessor

本文介绍了Spring框架中BeanPostProcessor接口的实现方式及其在IOC容器中的作用。详细解释了多个常用的BeanPostProcessor类的功能,例如参数注入、注解处理等,并展示了如何通过实现该接口来自定义Bean的初始化前后操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 *   实现BeanPostProcessor的类常用功能都有哪些
 *      InitDestroyAnnotationBeanPostProcessor:init和destroy方法的后处理,包括@PostConstruct和@PreDestroy注解
 *      AutowiredAnnotationBeanPostProcessor:处理含有@Autowired注解的参数注入
 *      ApplicationContextAwareProcessor:处理postProcessBeforeInitialization方法
 *      AsyncAnnotationBeanPostProcessor:处理@Async注解
 *      BeanValidationPostProcessor:参数校验
 *
 */

 

类实现BeanPostProcessor接口,并重写postProcessBeforeInitialization和postProcessAfterInitialization方法,将类注册到IOC容器中,这两个方法会在每一个组建被创建时都被调用

postProcessBeforeInitialization:在构造方法之后,初始化方法执行之前被调用
postProcessAfterInitialization:在初始化方法执行之后被调用

下面是具体的代码

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    //bean是当前组建,beanName是当前组建在容器中的id
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization->" + bean + "->" + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization->" + bean + "->" + beanName);
        return bean;
    }
}

当这个容器被注册到容器中时,方法被调用的顺序如下面

Construct->postProcessBeforeInitialization->Init->postProcessAfterInitialization->Destroy

原理:

下面是源码中调用方法的顺序:

    /**
     * populateBean(实例化bean并为其赋值)
     * {
     *     applyBeanPostProcessorsBeforeInitialization
     *     invokeInitMethods(反射调用初始化方法)
     *     applyBeanPostProcessorsAfterInitialization
     * }
     */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值