SpringBean的实例化
2022-03-14 00:30:13 4 举报
SpringBean的实例化
作者其他创作
大纲/内容
this.singletonsCurrentlyInCreation.add(beanName)
(mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName))
类不是抽象类,是单实例,不是懒加载
三级缓存中有
执行BeanPostProcessor的postProcessAfterInitialization()
this.singletonFactories.get(beanName)
尝试从一级缓存和二级缓存获取该bean
实例化所有剩余的非延迟初始化单例
bean为null
Object sharedInstance = getSingleton(beanName)
这里也是AOP进行动态代理的入口
实例化Bean
if (singletonFactory != null)
beanFactory.preInstantiateSingletons()
将对象放到第一缓存中,并从其他缓存删除
bean不为null
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName))
退出
获取不到,开始实例化
执行所有MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition()
二级缓存没有,从三级缓存取
执行SmartInitializingSingleton的afterSingletonsInstantiated()方法
for (String beanName : beanNames) {}
这里就开始执行afterPropertiesSet(实现了InitializingBean接口)方法@PostConstruct不是在这里执行的,他是在上面执行的
afterSingletonCreation(beanName)
exposedObject = earlySingletonReference
smartSingleton.afterSingletonsInstantiated()
从二级缓存取
this.singletonObjects.get(beanName)
尝试从缓存中获取其实例
for (String beanName : beanNames){}
执行所有InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
循环遍历容器中的beanDefinition,并实例化他们
有一个返回false
执行所有的BeanPostProcessor#postProcessBeforeInitialization 初始化之前的处理器方法规则:只要谁反回了null,后面的就都不要执行了
这边已经放到正在正在参加Bean的集合中了
返回值为null
singletonsCurrentlyInCreation.remove(beanName)
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames)
执行所有后置处理器SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法
从三级缓存中获取对象放到二级缓存中,并从三级缓存中删除
this.earlySingletonObjects.get(beanName)
执行容器中InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()
Bean的初始化
属性赋值
把它名字放到正在创建Bean的集合中
调用构造器
如果当前Bean是BeanNameAware执行其setBeanName方法如果当前Bean是BeanClassLoaderAware执行其setBeanClassLoader方法如果当前Bean是BeanFactoryAware执行其setBeanFactory方法
执行所有InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
从正在创建Bean的集合中删除
获取到
从一级缓存中取
addSingletonFactory()
如果当前Bean不在一级缓存中(说明当前Bean还没有创建完成),那把它放到三级缓存中,并把他从二级缓存中删除。
执行所有的BeanPostProcessor#postProcessAfterInitialization 初始化之前的处理器方法规则:只要谁反回了null,后面的就都不要执行了
如果从一级缓存和二级缓存获取该bean,重新赋值改值
beforeSingletonCreation(beanName)
如果有一个返回false,那么就不会进行赋值,此方法默认true
入口
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()){}
合并父容器的BeanDefinition
一级缓存没有,且当前Bean是正在创建的Bean
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName)
getBean(beanName)
获取容器中所有beanDefinition的名字
finishBeanFactoryInitialization(beanFactory)
全返回true
执行所有InstantiationAwareBeanPostProcessor的postProcessProperties方法
0 条评论
下一页