生命周期
说道bean的生命周期,首先就应该想到一个流程:
实例化–》依赖注入 --》初始化–》销毁
我们来看看具体的代码:
前面我们说过,调用SpringApplication.run方法之后,除了启动spring容器,它的返回结果,就是我们的容器,问为了展示生命周期的销毁阶段,我加了一个close方法,用来关闭容器。
我们在准备一个叫LifeCycleBean的bean,加上@Component注解,这样他就会被扫描到并加入到容器中
为了展示生命周期的各个阶段,我们给他加了4个方法
- 构造方法
- 依赖注入的方法
- 初始化方法
- 销毁方法
启动看看他们的执行顺序
可以看到执行的顺序是:构造–》依赖–》初始化–》销毁
bean后置处理器
还有一个跟bean生命周期相关的,就是bean的后置处理器
我们先定义一个自己的后置处理器类,实现了2个最典型的bean后置处理器接口,然后重写了比较重要的6个方法
我们一个一个来看看
1 postProcessBeforeDestruction
bean销毁之前执行的方法
我们打印一下log,这里判断一下,当bean是我们刚刚定义的LifeCycleBean时,才打印。
2 postProcessBeforeInstantiation
bean实例化之前执行的方法,会在还没有调用构造方法之前执行。
这个方法会返回一个结果,如果返回不为null,就会替换我们的bean。
同样的我们也打印一下
3 postProcessAfterInstantiation
bean实例化之后执行的方法,如果这个方法返回的true,就会继续执行后续的依赖注入流程,但是如果返回的false,他就会跳过依赖注入的阶段。一般我们是不会修改他的返回值。
4 postProcessProperties
依赖注入阶段执行,有很多后置处理器都是在这个阶段去做的一些处理,例如@Autowired、@Value、@Resource这些都有相应的后置处理器在依赖注入阶段去做一些扩展功能。
前面的两个方法其实都很少有扩展功能,这个的扩展就比较多了,主要去解析依赖注入相关的注解。
5 postProcessBeforeInitialization
初始化之前执行的方法,他的返回结果同样会替换掉原始对象。
他的典型例子有两个,@PostConstruct,@ConfigurationProperties
6 postProcessAfterInitialization
初始化之后执行的方法,他的返回结果同样会替换掉原始对象。
他的典型例子就是做一些代理增强
我们启动来看看他们的执行时机
总结
这次我们学习到了bean的生命周期主要就是4个阶段:创建–》依赖注入 --》初始化–》销毁
除了这4个阶段以外,我们还知道在各个阶段里都可能会有一些功能增强,都是由bean的后置处理器来提供的。