spring的bean周期中BeanPostProcessor浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40718168/article/details/83995020

参考:https://www.cnblogs.com/sishang/p/6576665.html

1. 基本概念

spring容器在实例化bean之后(通过构造器创建对象并注入属性值即为实例化),可以使用BeanPostProcessor接口在bean的初始化方法前后根据需要做自己的逻辑处理。

2. BeanPostProcessor后置处理器的使用

BeanPostProcessor接口有两个方法,postProcessBeforeInitialization和postProcessAfterInitialization,默认情况下后置处理器会处理容器中所有的bean。

postProcessBeforeInitialization在bean初始化方法之前调用,初始化方法包括:bean标签添加init-method属性指定Java类中初始化方法、 @PostConstruct注解指定初始化方法,Java类实现InitailztingBean接口所产生的afterPropertiesSet()方法等。

postProcessAfterInitialization在bean初始化方法之后调用。

public class PostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {//此方法获取容器中所有的bean,根据 beanName 名称选择要处理的bean,此处过滤实例ID为narCodeService
            
            return bean;
        }
        System.out.println("后置处理器处理bean=【"+beanName+"】开始");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {
            return bean;
        }
        System.out.println("后置处理器处理bean=【"+beanName+"】完毕!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

}

上段代码两个方法的第一个参数为bean对象,第二个参数为bean对象的全称名称(包名加类名)。然后该实现类配置在spring配置文件中就可以使用了。多个后置处理器按照配置顺序执行,可以配置order属性进行设置优先级。

猜你喜欢

转载自blog.csdn.net/qq_40718168/article/details/83995020
今日推荐