这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
前言
Spring框架解决了工程中遇到的各种难题,也是做业务工程的Java工程师必须掌握的技能, Spring框架平时大家都在使用,但是你了解Spring 生命周期中的各个扩展点吗?IoC 容器负责管理容器中所有bean的生命周期,而在 bean 生命周期的不同阶段,Spring 提供了不同的扩展点来改变 bean 的命运。
Spring框架Bean的生命周期
四个阶段
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁
在这四个阶段的过程种又有很多扩展点,方便开发人员去做一些定制的操作,比如nacos配置文件加载, 一些注册实例Bean的加载顺序等等。
扩展点又可以分为
影响多个Bean和影响单个Bean。
Spring容器扩展机制
BeanFactoryPostProcessor
允许我们在容器实例化相应对象之前,对注册到容器的 BeanDefinition 所保存的信息做一些额外的操作,比如修改 bean 定义的某些属性或者增加其他信息等。
自定义扩展类
通常需要实现 org.springframework.beans.factory.config.BeanFactoryPostProcessor接口,与此同时,因为容器中可能有多个BeanFactoryPostProcessor,可能还需要实现 org.springframework.core.Ordered接口,以保证BeanFactoryPostProcessor按照顺序执行。
BeanPostProcessor
其存在于对象实例化阶段。跟BeanFactoryPostProcessor类似,它会处理容器内所有符合条件并且已经实例化后的对象。简单的对比,BeanFactoryPostProcessor处理bean的定义,而BeanPostProcessor则处理bean完成实例化后的对象。
public interface BeanPostProcessor {
// 前置处理
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 后置处理
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
常见开源组件的扩展点
比如说Nacos配置中心加载,引入依赖nacos-config-spring-boot-starter, SpringBoot脚手架提供了很多的常用开源组件的starter的继承方法。原理也很渐渐基于SpringFactoriesLoader类是通过类加载器通过getResources()和getSystemResources()查找所有META-INF/spring.factories的文件,这里面的配置一般是springboot自动配置的配置类,进行初始化并缓存。
阅读这些框架源码,了解SpringBean的生命周期,和生命周期中的扩展点非常的有必要。