转载

Spring bean 的声明周期

2.1 生命周期的流程

1、构建 (构造函数:或者说是 construct)

2、初始化(init)

3、销毁 (destory)

再复杂一点的生命周期是:

1、构建

2、设置属性

3、后置处理器 的前置处理方法: BeanPostProcessor.postProcessBeforeInitialization

4、初始化(init)

5、后置处理器 的后置处理方法: BeanPostProcessor.postProcessAfterInitialization

6、销毁

每个步骤都有各自的工作。比如我们如果要在 bean 被注入到IOC之前完成一些工作,或者要修改被 setter 的属性。都需要到对应的步骤 修改对应的处理器,或者方法。

具体对应的步骤,我们放到后面来说。

构建特性:

如果是 单实例:在容器启动的时候创建对象。注入到 IOC

如果是多实例:在每次获取的时候创建对象

初始化:

对象创建完成,并且赋值之后,调用初始化方法。

销毁:

单实例:容器关闭的时候

多实例:容器不会关闭这个 Bean,容器不会调用销毁方法。

2.2 自定义初始化和销毁的方法

1、注入bean

@Bean(initMethod = "initMethod", destroyMethod = "destoryMethod")
public Car car() {
  return new Car();
}

通过制定 initMethod 和 destroyMethod 方法来实现自定义的 init 和 destory 方法。

2、通过接口

public class Cat implements InitializingBean, DisposableBean {

    public Cat() {
        System.out.println("Cat...constructor");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Cat...属性赋值之后 init 方法");
    }

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

}

实现 InitializingBean 的接口,通过方法 afterPropertiesSet 来完成 init 之前的工作。(另外可以看出在 属性设置之后)。通过 destroy 方法来完成 destory 的方法。

3、通过 JSR250

@PostConstruct
public void initMethod() {
  System.out.println("Dog...init--- PostConstruct");
}

@PreDestroy
public void destroyMethod() {
  System.out.println("Dog...destroy--PreDestroy");
}

使用 @PostConstruct 和 @PreDestroy 注解。

4、BeanPostProcessor

后置处理器是 Spring 最酷的功能。

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        System.out.println("Bean Post Processor....postProcessBeforeInitialization...." + beanName + bean);

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean Post Processor....postProcessAfterInitialization" + beanName+ bean);

        return bean;
    }
    
}

Spring 底层的注解 比如 bean赋值,注入其他组件, @Async 都是通过 beanPostProcessor 实现的

2.3 debug 流程

关键步骤:

Spring bean 的声明周期

populateBean(beanName, mbd, instanceWrapper) : 完成属性的赋值

initializeBean(beanName, exposedObject, mbd); 完成初始化的工作。

保护一下步骤:

Spring bean 的声明周期

applyBeanPostProcessorsBeforeInitialization:

invokeInitMethods(beanName, wrappedBean, mbd);

applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

Spring bean 的声明周期

原文  https://segmentfault.com/a/1190000021554606
正文到此结束
Loading...