Spring 生命周期流程图
2022-08-18 09:40:40 1 举报
Spring 生命周期流程图
作者其他创作
大纲/内容
执行顺序
阶段一:BeanDefinition 配置阶段读取配置文件的信息,生成 BeanDefinition
注解方式
BeanDefinition:Bean定义,通常里面存储了在 XML、或者 Properties 配置文件中能配置的信息。eg: 1. scope: bean 的作用域2. parentName: 父类名称3. beanClassName: bean 的全路径名称4. lazyInit:是否为懒加载5. primary:是否为首要的(当一个 beanFactory 有多个同类型的 Bean 对象时,通过依赖查找获取 primary 标注的对象)6. factoryBeanName: 工厂 Bean 名称等等一系列属性
BeanFactoryAware
Properties配置
阶段十四:Spring Bean 初始化后阶段该阶段做的事情和初始化前阶段一致,都是修改 Bean 的值
阶段一:Spring Bean 销毁前阶段该阶段可以对 Bean 的值做修改
1. 添加 @PreDestroy 注解标注的方法
阶段十四:Spring Bean 初始化完成阶段
无参构造实例化 Bean 对象
XML 配置
GenericBeanDefinition通用 Bean 定义
注册流程
否
XMLBeanDefinitionReader
有BeanFactory 支持可生效
创建 Bean 实例(createBeanInstance)
给构造方法参数赋默认值
EnvironmentAware
Bean 的元信息配置
Bean 定义的来源
ChildBeanDefinition子类 Bean 定义
BeanPostProcessor(Bean 的后置处理器)
1. 初始化前的回调扩展方法:postProcessBeforeInitialization2. 初始化后的回调扩展方法:postProcessAfterInitialization
阶段九:Spring Bean 属性赋值前阶段该阶段通过扩展接口可以修改 BeanDefinition 中的属性值,之后会根据原来的值或者返回值对 Bean 进行赋值
SmartInitializingSingleton(单例初始化扩展接口)
1. 单例 Bean 初始化完成以后执行的扩展方法: afterSingletonsInstantiated
属性赋值(populateBean)
读取操作
获取实例化策略对象,并调用实例化方法
阶段三:BeanDefinition 合并阶段如果有父类则合并父类的 BeanDefinition,没有父类则直接返回当前Bean 的 RootBeanDefinition
BeanDefinition
1. beanDefinitionMap 是一个 ConcurrentHashMap 用来存储 beanName 和 BeanDefinition 的映射2. beanDefinitionNames 是一个 ArrayList,用来存储 beanDefinition 的注册顺序
是否获取到 priamry 构造函数
重写 postProcessAfterInstantiation 方法
BeanFactory
MessageSourceAware
EmbeddedValueResolverAware
重写 postProcessProperties 方法
是
返回目标对象
执行顺序为: BeanNameAware --> BeanClassLoaderAware --> BeanFactoryAware
DestructionAwareBeanPostProcessor(销毁 Bean 的后置处理器)
1. bean 销毁前的回调扩展方法:postProcessBeforeDestruction
bean 初始化 (initializeBean)
PropertiesBeanDefinitionReader
重写 postProcessBeforeInstantiation 方法
3. 配置 Bean 的 init-method 方法
1. 获取 BeanFactory 下的所有 BeanPostProcessor 进行遍历2. 如果有 InstantiationAwareBeanPostProcessor 的实例,则调用该实例的实例化前的扩展回调方法( postProcessBeforeInstantiation)3. 用户在该方法中可以修改 bean 的属性值,或者返回一个新的代理对象4. 如果 postProcessBeforeInstantiation 方法返回的是 null 值,则创建 Bean 的流程继续执行,如果返回的代理对象,则执行代理对象的初始化后阶段的扩展回调方法,并返回代理对象,结束 Bean 的创建流程。
MergedBeanDefinitionPostProcessor(合并 BeanDefinition的后置处理器)
1. 合并 BeanDefinition 后的回调方法(实际调用时机为实例化对象完成,bean 属性填充前调用):postProcessMergedBeanDefinition
ApplicationContextAware
BeanClassLoaderAware
ApplicationEventPublisherAware
阶段五:Spring Bean 实例化前阶段该阶段可以让用户返回一个代理对象,而不是目标对象
需要有Application Context 环境支持
返回true
BeanDefinitionRegistry(BeanDefinition注册中心(负责维护 BeanDefinition ))
之前是否进行过解析
执行时机为:ApplicationContextAwareProcessor#postProcessBeforeInitialization
有参构造实例化对象(构造器注入)
利用反射创建 Bean 实例
阶段十:Spring Bean 属性赋值阶段将 PropertyValues 中的值赋值给 Bean
阶段十三:Spring Bean 初始化阶段
重写 postProcessBeforeInitialization 方法
AbstractBeanDefinition 抽象 Bean 定义
1. 添加 @PreConstruct 注解标注的方法
API 方式
阶段二:Spring Bean 销毁阶段
重写 postProcessBeforeDestruction 方法
3. 自定义销毁方法
Aware (回调注入接口)
RootBeanDefinition 根 Bean 定义
1. 该阶段是 beanFactory 在调用 preInstantiateSingletons 方法时触发,preInstantiateSingletons 方法会去实例化所有的单例 bean, 初始化完成以后会去调用 bean 的扩展方法 afterSingletonsInstantiated。用户可在 afterSingletonsInstantiated 方法中去安全的修改 Bean 的定义,避免 Bean 过早的修改导致初始化操作时,Bean 不完整。
重写 afterSingletonsInstantiated 方法
ConfigurableBeanFactory(可配置的 BeanFactory)
1. 获取合并后的 BeanDefinition:getMergedBeanDefinition(String beanName)
不能获取
阶段二:BeanDefinition 注册阶段将 BeanDefinition 注册到 beanDefinitionMap 中
阶段四:Spring Bean Class 加载阶段解析 Bean 的 Class信息,使用类加载器加载到 JVM 中
resolveBeforeInstantiation
AbstractBeanFactory(抽象的 BeanFactory)
1. 解析 Bean 的 Class信息,使用类加载器加载到 JVM 中:resolveBeanClass
从 Bean 的后置处理器中去获取构造方法列表
获取 BeanClass获取声明的构造方法
是否需要构造器注入
2. 实现 InitializingBean 接口并重写 afterPropertiesSet 方法
返回 Bean 对象
重写 postProcessMergedBeanDefinition 方法
返回代理对象
能获取
阶段十二:Spring Bean 初始化前阶段该阶段可以修改实例化 bean 的属性值,如果值发生了修改,则替换旧值,否则采用旧值
阶段十一:Spring Bean Aware 接口回调阶段将 Aware 前面的东西注入到 Bean 中例如:BeanNameAware 则是将 BeanName 注入到 bean 中
ApplicationContext
重写 postProcessAfterInitialization 方法
满足以下情况之一:1. 上一步没有获取到构造方法2. bean 的注入模式为构造器注入3. beanDefinition 存在构造方法参数4. 调用当前方法是传递了构造方法参数
BeanNameAware
AnnotatedBeanDefinitionReader
通过resolveDependency方法去依赖查找需要的构造方法参数
阶段六:Spring Bean 实例化阶段根据 BeanDefinition 创建 Bean 的实例
AbstractApplicationContext#doClose 执行 ApplicationContext 上下文关闭时,会销毁所有的 Bean
继承
如果通过API方式,则已经拿到了 Bean 定义,无需读取了
1. 进行 BeanDefinition 验证2. 根据 beanName 获取 BeanDefinition3. 判断 BeanDefinition 是否存在3.1. BeanDefinition 已存在,判断 Bean 是否允许覆盖,若不允许覆盖,直接抛出错误,允许则添加到 beanDefinitionMap 中3.2.1 BeanDefinition 不存在,判断 Bean 是否已经创建完成,一般来说是 false3.2.2 将 BeanDefinition 添加到 beanDefinitionMap 和 beanDefinitionNames 中
执行 BeanFactory 相关的 Aware 扩展方法
阶段七:修改 MergedBeanDefinition 阶段通过后处理器修改 MergedBeanDefinition
2. 实现 DisposableBean 接口的 destroy() 方法
InstantiationAwareBeanPostProcessor(实例化 Bean回调的后置处理器)
1. 实例化前的回调扩展方法:postProcessBeforeInstantiation2. 实例化后的回调扩展方法:postProcessAfterInstantiation3. 属性赋值前的回调扩展方法:postProcessProperties4. 属性赋值前的回调扩展方法(历史版本使用,5.1以后统一采用 postProcessProperties):postProcessPropertyValues
满足其一
阶段八:Spring Bean 实例化后阶段通过后处理器修改 Bean 的属性值,如果扩展方法返回 false,则跳过属性填充阶段
ResourceLoaderAware
0 条评论
回复 删除
下一页