Spring Bean声明周期
2022-02-25 16:46:42 0 举报
Spring完整声明周期解析
作者其他创作
大纲/内容
Spring内置InstantiationAwareBean后置处理器接口,循环所实例化后方法,如果有返回false,直接return ,不会执行接下来的属性赋值阶段。但bean其它后续操作会进行
Spring内置InstantiationAwareBean后置处理器接口,返回代理对象代替目标bean实例。循环所有实例化前方法, 如果返回bean不为空,调用实例化后方法。
循环所有BeanPostProcessor下初始化前方法,如果返回新的ObjectBean,替代已经存在ObjectBean
Spring内置MergedBeanDefinition后置处理器接口对RootBeanDefinition进行加工处理
BeanDefinition 合并阶段
Context Aware 接口回调
mbd.isPrototype()
把获取到pvs设置对象属性中
线程安全创建Bean
Bean 销毁阶段
MergedBeanDefinition
true
Bean Aware接口回调
postProcessAfterInitialization方法
postProcessBeforeInitialization方法
1. 配置了 `factory-method`属性使用工厂方法实例化对象,例如@Bean注解 2. 查找最匹配构造方法来实例化对象:Constructor<?>[] ctors 3. 如果ctors为空,尝试获取优先的构造方法 4. 如果还是为空,默认构造方法返回实例化对象
addSingleton()
循环依赖解决
autowireConstructor()
afterSingletonsInstantiated()
注册销毁bean的对象DisposableBeanAdapter,用于单例bean销毁,且销毁时没有指定bean名字
使用合适的实例化策略来创建 Bean 的实例
preInstantiateSingletons()
循环所有BeanPostProcessor下初始化后方法,如果返回新的ObjectBean,替代已经存在ObjectBean
newSingleton
实现接口:DestructionAwareBeanPostProcessor 调用销毁前方法: postProcessBeforeDestruction()执行:LifecycleMetadata#invokeDestroyMethods()
BeanFactory#getBean
InitDestroyAnnotationBeanPostProcessor
1.{AutowiredAnnotationBeanPostProcessor#postProcessProperties} 会解析 @Autowired 和 @Value 注解标注的属性,获取对应属性值;2.{CommonAnnotationBeanPostProcessor#postProcessProperties} 会 解析 Resource 注解标注的属性,获取对应的属性值
Bean 初始化后阶段
AbstractAutoProxyCreator类实现该接口重写其方法主要作用创建目标代理对象,大致逻辑:1.获取所有的Advice2.创建Aop proxy
singletonFactory.getObject();
getSingleton()
return bean
addSingletonFactory()
Bean 实例化后阶段
postProcessBeforeInstantiation方法
LifecycleMetadata#invokeInitMethods()
1. InitializingBean#afterPropertiesSet() 2. invokeCustomInitMethod () //自定义初始化方法
bean实例化方法
bean添加一级缓存,其次移除二级缓存和三级缓存,最后添加benaName集合
目的解决单例bean循环依赖注入
BeanDefinition属性: synthetic Definition 不是用户定义的(由 Spring 解析出来的)
registerDisposableBean
通过工厂方法创建对象
创建最新bean
销毁前Spring内置实现方法
applyPropertyValues
bean加载
通过构造函数反射创建对象
调用DisposableBeanAdapter#destroy()执行: 1. DisposableBean#destroy() 2. 自定义销毁方法备注虽然执行销毁方法,并没有从容器中移除和gc回收
Bean 初始化前阶段
mbd.isSingleton()
ApplicationContextAwareProcessor
bean !=null
默认构造函数
对注解@PreDestroy下的方法回调
Supplier回调方法
Spring内置初始化前内置Bean后置处理器接口方法调用
Bean 实例阶段
使用工厂方法
Bean 属性赋值前阶段
postProcessMergedBeanDefinition方法
RootBeanDefinition(mbd)
Spring初始化前内置Bean后置处理器接口实现方法
1. AutowiredAnnotationBeanPostProcessor类会先解析出 @Autowired 和 @Value 注解标注的属性的注入元信息,后续进行依赖注入2. CommonAnnotationBeanPostProcessor类会先解析出 @Resource 注解标注的属性的注入元信息,后续进行依赖注入,@PostConstruct 和 @PreDestroy 注解标注的方法,并构建一个 LifecycleMetadata 对象,用于后续生命周期中的初始化和销毁
对@PostConstruct 注解自定义方法回调
invokeInitMethods
下面是Spring Context中使用到
return exposedObject
Spring内置InstantiationAwareBean后置处理器对PropertyValues 值行修改
单例bean实例化后回调,判断bean是否实现如下接口:SmartInitializingSingleton
通过beanName反射创建对象
EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware
InstantiationStrategy接口
默认实现类: CglibSubclassingInstantiationStrategy,并对下面类SimpleInstantiationStrategy该类实现该接口下面三个重载实例化对象方法
Bean 实例化前阶段
AbstractAutowireCapableBeanFactory#createBean()
false
Bean 销毁前阶段
完成bean创建生命周期
1. BeanNameAware2. BeanClassLoaderAware3. BeanFactoryAware
使用反射机制
postProcessProperties方法
0 条评论
下一页