spring 生命周期源码梳理
2023-11-30 10:51:39 0 举报
spring 生命周期源码梳理
作者其他创作
大纲/内容
beanName去掉&前缀 看单例池中是否存在 getSingleton
加载类
1. 当前Bean是否实现了DisposableBean接口2. 或者,当前Bean是否实现了AutoCloseable接口3. BeanDefinition中是否指定了destroyMethod4. 调用DestructionAwareBeanPostProcessor.requiresDestruction(bean)进行判断 a. ApplicationListenerDetector中直接使得ApplicationListener是DisposableBean b. InitDestroyAnnotationBeanPostProcessor中使得拥有@PreDestroy注解了的方法就是DisposableBean5. 把符合上述任意一个条件的Bean适配成DisposableBeanAdapter对象,并存入disposableBeans中(一个LinkedHashMap
一级缓存singletonObjects二级缓存earlySingletonObjects三级缓存singletonFactories
单例池存在
spring的自动注入
Supplier创建对象判断BeanDefinition中是否设置了Supplier,如果设置了则调用Supplier的get()得到对象
是
是否是FactoryBean
添加到一级缓存中,清除二级三级缓存
是,并且是FactoryBean类型
返回单例对象
实例化bean
1. 查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调用其afterPropertiesSet()方法2. 执行BeanDefinition中指定的初始化方法
1. InitDestroyAnnotationBeanPostProcessor会在初始化前这个步骤中执行@PostConstruct的方法,2. ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调: a. EnvironmentAware:回传环境变量 b. EmbeddedValueResolverAware:回传占位符解析器 c. ResourceLoaderAware:回传资源加载器 d. ApplicationEventPublisherAware:回传事件发布器 e. MessageSourceAware:回传国际化资源 f. ApplicationStartupAware:回传应用其他监听对象,可忽略 g. ApplicationContextAware:回传Spring容器ApplicationContext
bean名称添加前缀 &
BeanPostProcessor#postProcessAfterInitialization
创建单例bean,并放入单例池
实例化后InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
执行创建bean#createBean()#doCreateBean()
有一个MergedBeanDefinitionPostProcessor,是为了找到所有依赖注入点
BeanDefinition的后置处理MergedBeanDefinitionPostProcessor
是否是FactoryBean类型
工厂方法创建对象
bean是否实现SmartInitializingSingleton接口
直接返回单例池对象
dependsOn 是否依赖其它bean如果依赖则创建所依赖的bean
为了解决循环依赖
代理对象
返回经历过完整生命周期的bean对象
BeanNameAwareBeanFactoryAwareBeanClassLoadAware
获取SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference()
推断构造方法
是否是单例mbd.isSingleton()
实例化所有非懒加载的单例bean
执行方法SmartInitializingSingleton#afterSingletonsInstantiated
是否要提前生成代理对象其实就是找出该bean是否被对应AOP Advisor 匹配上
缓存没有调用FactoryBean#getObject()获取对象会经过bean初始化后过程
对Bean最终进行处理,Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象
初始化后
所有非懒加载的bean加载完
创建beandoCreateBean
获取Bean #getBean#doGetBean
否
存在
调用父BeanFactory获取对象
父BeanFactory是否存在
初始化后postProcessAfterInitialization
属性填充
int resolvedAutowireMode = mbd.getResolvedAutowireMode();if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE)
!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()
执行Aware回调
单例池不存在
只有出现循环依赖,在调用getSingleton 如果一二级缓存中都没有,才会调用三级缓存lamda表达式,提前创建一个对象(可能是原始对象 ,可能是代理对象,反正生成的是一个未经过完整生命周期的对象),然后发入到二级缓存中,并清除三级缓存。如果没有出现循环依赖,三级缓存用不到。当bean经历了完整的生命周期,加入到一级缓存SingletonObjects 中,会清除二三级缓存
有值直接返回对象
初始化前
BeanPostProcessor#postProcessBeforeInitialization
判断是否出现循环依赖,其实就是判断当前依赖的bean 是否真正创建中
初始化
invokeInitMethods
DefaultListableBeanFactory#preInstantiateSingletons
是否是原型isPrototype
实例化非懒加载单例beanAbstractApplicationContext#reflesh#finishBeanFactoryInitialization
记录那些bean有销毁
bean 是否是&前缀
实例化前postProcessBeforeInstantiation
处理属性 #postProcessPropertiesAutowireAnnotationBeanPostProcessor 处理 @@Autowired、@Value、@InjectCommonAnnotationBeanPostProcessor 处理 @Resource
如果当前Bean中的BeanDefinition中设置了PropertyValues,那么最终将是PropertyValues中的值,覆盖@AutowiredInstantiationAwareBeanPostProcessor#postProcessPropertyValues
原始对象
返回对象
是否是FactoryBean类型返回getObjectForBeanInstance
提前缓存单例创建工厂放到三级缓存中,出现循环依赖才用得上
0 条评论
下一页