前言:Bean的生命周期主要是:创建——初始化——销毁

一.创建

对象的创建,主要分为两种情况。

1.单实例:在容器启动的时候创建对象
2.多实例:在每次获取的时候创建对象

这个xml和注解的不同在上一篇文章讲过,这里就不再描述。对于注解方式,是用@Scope

二.初始化&&销毁

原来我们是在xml对应的bean上加入 init-method  和 destroy-method 

对于注解的,我们有一下几种方法

1.在@bean上注解初始化和销毁方法

@bean(initMethod=”指定初始化方法”,destoryMethod=”指定销毁方法”)

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_生命周期

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_初始化方法_02

这里应该注意:对于销毁方法,单例对象,容器关闭的时候调用销毁方法。对于多实例对象,容器不会管理这个bean,不会代用销毁方法

2.实现了InitializingBean,DisposableBean两个类中的方法。注意对于多例,容器一样不管理bean

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_初始化方法_03

3.@PostConstruct :在bean创建并完成属性赋值,来执行初始化方法
  @PreDestroy:在容器销毁bean之前通知我们进行清理

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_初始化方法_04

4.实现MyBeanPostProcessor 接口。这里要注意,该类必须是组件,然后被扫描注入。
方法分别是对象初始化前后,这个要区别上面是初始化和销毁方法。且对于整个项目的所有Bean对象都有用,在bean对象构造方法执行后,初始化方法执行前执行postProcessBeforeInitialization方法,在初始化方法后执行postProcessAfterInitialization方法。而且注意的时候初始化前的方法必须有返回,否则初始化后方法无法执行,具体原因下次探讨,应该是参数的问题。且这两个方法的参数分别是加载的bean对象以及对应的bean名称

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_Spring注解_05

.到这里,我们就一个Bean的生命周期我们就基本上了解了。
首先我们使用构造方法创建一个Bean对象,然后在初始化前可以使用postProcessBeforeInitialization方法,初始化的时候我们可以自定义函数,在初始化后我们可以使用postProcessAfterInitialization方法,然后我们也可以再销毁的时候定义方法。

三.从Spring源码看Bean部分生命周期

这个主要是在实现了MyBeanPostProcessor 接口类的两个方法debug。然后查看方法栈

可以看出,先执行populateBean方法,进行属性的配置,然后执行initalizeBean 初始化属性

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_生命周期_06

initializeBean方法:在初始化属性中,我们先执行postProcessBeforeInitialization再执行初始化方法,最后执行postProcessAfterInitialization方法

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_初始化_07

这里要注意的是: 对于postProcessBeforeInitialization方法
遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
 一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization。

springboot 接口请求一次的生命周期 spring boot 注解 生命周期_初始化方法_08

我猜想上面我们自定义postProcessBeforeInitialization方法返回null。导致后面postProcessAfterInitialization方法无法执行。这个可以debug进去看看,自定义的postProcessBeforeInitialization返回空的话,你会发现方法栈根本不会执行postProcessAfterInitialization方法

四.最后

这里有个比较重要的概念:就是
 Spring底层对 BeanPostProcessor 的使用;
 bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;