其他分享
首页 > 其他分享> > 【走近Spring】Spring Ioc容器中Bean的生命周期详解(BeanPostProcessor解析)

【走近Spring】Spring Ioc容器中Bean的生命周期详解(BeanPostProcessor解析)

作者:互联网

bean的生命周期指的是bean创建——初始化到销毁的过程。

我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。

单实例:在容器启动的时候创建对象
多实例:容器不会管理这个bean;容器不会调用销毁方法;

Bean生命周期初始化、销毁相关的4种方式

1、@Bean指定初始化方法和销毁方法 initMethod destroyMethod

2、实现InitializingBean和DisposableBean接口

将要创建指定初始化和销毁方法的类实现初始化接口InitializingBean,如果需要指定销毁方法实现DisposableBean接口。

public class InitAndDisposableBean implements InitializingBean, DisposableBean {
    public InitAndDisposableBean() {
        System.out.println("InitAndDisposableBean创建完成。。。。。。。。。。。。");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("InitAndDisposableBean容器销毁,实现DisposableBean接口调用销毁方法...........");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitAndDisposableBean创建后实现InitializingBean调用初始化方法。。。。。。。。。。。。");
    }
}

3、使用JSR250规范:@PostContruct、@PreDestroy

在需要指定初始化和销毁方法的Bean里创建对应的初始化和销毁方法,使用对应注解标注即可。

@Component
public class Student {
    @PostConstruct
    public void init(){
        System.out.println("Student postConstruct...");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("Student preDestroy...");
    }
}

很多人迷糊@PostConstruct会在构造函数之前执行还是之后执行呢?其实从单词中也能见名知意(此处以servlet为例):

4、BeanPostProcessor接口

public interface BeanPostProcessor {
    //在任何初始化方法(例如上面的三种方式,定义的init方法,@PostConstruct,接口InitializingBean的方法)调用之前工作
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //这个是在上面的初始化方法调用之后工作
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

Bean的后置处理器,在bean初始化前后处理一些工作,就是在上面三种初始化(init,@PostConstruct,InitializingBean接口)调用的前后做一些工作的处理.。通过这个方法可以对bean进行一些包装和处理。

BeanPostProcessor在Spring中有大量的应用。它提供了功能相当于我们可以在Bean放进Ioc容器前后做些事情,比如包装、生成代理对象等一般都是通过此接口实现的。当把Bean放进去时,Spring会调用配置执行的所有的BeanPostProcessor。

比如解析@Async、@Autowired的AutowiredAnnotationBeanPostProcessor后置处理器。

关于BeanPostProcessor的使用,后续还有专门的文章进行分析,此处只做简单的一个生命周期相关的讨论。

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

    /**
     * 在每个bean创建之后的初始化方法之前调用
     * @param bean 当前实例化的bean
     * @param beanName bean的名称
     * @return 返回实例化的bean或者可以对对象进行再封装返回
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的postProcessBeforeInitialization方法执行,当前bean【" + bean + "】");
        return bean;
    }


    /**
     * 在每个bean的初始化方法执行之后被调用
     * @param bean 当前实例化的bean
     * @param beanName bean的名称
     * @return 返回实例化的bean或者可以对对象进行再封装返回
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor的postProcessAfterInitialization方法执行,当前bean【" + bean + "】");
        return bean;
    }
}

需要注意的是:实现这个接口的类,需要放入IOC容器中才会生效。

BeanPostProcessor总结

BeanPostProcessor是Spring对开闭原则很好的实践。上面我们已经体会到了它的用处,它就像一个钩子,让我们可以参与到Spring Bean的生命周期的重要部分。下面简单来个总结:

在这里插入图片描述

从上图中我们可以看到一共有5个接口共10个回调方法,即十个扩展点。


五个接口十个扩展点

 

标签:初始化,BeanPostProcessor,Spring,bean,Bean,方法,public
来源: https://www.cnblogs.com/xfeiyun/p/15669748.html