Spring Bean的生命周期

Spring Bean的生命周期

Bean 生命周期

JVM 管理对象是也有一套生命周期
Spring 也有一套生命周期
JVM 和 Spring 没有太大关系,JVM 生命周期完成后才是 Spring 生命周期

Bean 初始化的前提是 对象(实例)的初始化

注意

  1. 不管是初始化方法还是销毁方法,两种方式(框架提供的和自定义)可以同时存在,但是框架提供的在自定义前面执行
  2. spring 管理 bean 的生命周期(完整的)是针对单例的 bean,通过原型创建的 bean 不会纳入 spring 容器中,因此不会执行生命周期(不完整的,销毁方法无法执行)

初始化方法

框架提供的接口

实现 InitializingBean 接口,并实现其中的 afterProperties 方法

自定义方法

自定义初始化方法,并通过 init-method 属性来指定即可,案例如下

销毁方法

销毁方法仅限于单例的 Bean 对象,因为原型容器存储的是 Class 类型,所以原型容器创建的对象是一次性的,无法执行销毁方法。

框架提供的接口

实现 DisposableBean 接口,并实现其中的 destroy 方法

自定义方法

自定义销毁方法,并通过 destroy-method 属性来指定即可,案例如下

后置处理器

装配后置处理器,在初始化方法执行前的和执行后执行

注意 后置处理器的方法是针对所有的 Bean 对象,而不是单独的某一个 Bean

案例

@Slf4j
public class MyBeanPostProcessor implements BeanPostProcessor {
    /**
     * 在初始化方法前
     * @param bean the new bean instance
     * @param beanName the name of the bean
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.debug("在初始化方法前");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    /**
     * 在初始化方法后
     * @param bean the new bean instance
     * @param beanName the name of the bean
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        log.debug("在初始化方法后");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

beans.xml案例

<bean id="唯一标识符" class="完整类名" init-method="自定义初始化方法" destroy-method="自定义销毁方法"/>
<bean class="后置处理器的完整类名"/>