Spring中InitializingBean和BeanPostProcessor区别

InitializingBean和BeanPostProcess都是Spring提供的接口

区别:

1、BeanPostProcess先于InitializingBean执行
2、InitializingBean是在对象已经实例化之后,执行接口的afterPropertiesSet()方法;
BeanPostProcess是在bean构建的过程中,postProcessBeforeInitialization,postProcessAfterInitialization
注意:每个bean在构建的过程中,Spring都会遍历所有的BeanPostProcessor的实现类,调用实现类中的方法,入参为构建好的bean
3、自己实现BeanPostProcess接口时,如果想生效,还需将实现类构建成SpringBean
即需要用@Component注解 等方法

执行顺序

类构造方法 - postProcessBeforeInitialization - @PostConstruct注解的方法 - InitializingBean的afterPropertiesSet()方法 - postProcessAfterInitialization

测试代码如下:

@Component
public class TestInitOrder implements InitializingBean {

    public TestInitOrder() {
        System.out.println("TestInitOrder construct");
    }

    @PostConstruct
    public void testPostConstruct() {
        System.out.println("testPostConstruct");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
}

@Component
public class TestBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.contains("testInitOrder")) {
            System.out.println("TestInitOrder postProcessBeforeInitialization");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.contains("testInitOrder")) {
            System.out.println("TestInitOrder postProcessAfterInitialization");
        }
        return bean;
    }
}

调用链路

BeanPostProcess接口调用链路如下:

在这里插入图片描述
在这里插入图片描述
自己创建BeanPostProcessor实现类
在这里插入图片描述

InitializingBean接口调用链路如下:

在这里插入图片描述
由调用链路看出,执行的方法先后顺序

附加:Lifecycle实现类调用顺序

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/105776046