bean生命周期
2021-10-17 20:02:03 10 举报
AI智能生成
bean生命周期
作者其他创作
大纲/内容
AbstractBeanFactory#doGetBean(name,...)<br>根据名称获取Bean
DefaultSingletonBeanRegistry#getSingleton(name,true)<br>获取bean,并且允许早期引用<br>
singletonObjects#get(name)<br>从单例池获取
如果没有并且需要bean正在创建中,那么就从下面的缓存中取
earlySingletonObjects#get(name)<br>从早期单例对象获取(二级缓存)
singletonFactories.get(name)<br>从单例工厂获取(三级缓存)
singletonFactory#getObject<br>如果三级缓存有,则调用getObject获取bean
earlySiingletonObjects#put<br>将获取的bean放入到二级缓存
singletonFactories#remove<br>从三级缓存中移除
DefaultSingletonBeanRegistry#getSingleton(beanName,singletonFactory)<br>如果没有,那么向单例池放一个ObjectFactory,这个factory就是调用creatBean()<br>
加锁
singleObjects#get()<br>类似双锁检测,看看有没有
beforeSingletonCreation<br>
singletonsCurrentlyInCreation#add<br>添加到一个集合,存的是正在创建的bean
singletonFactory#getObject<br>这里就是调用createBean()
AbstractAutowireCapableBeanFactory#createBean<br>创建bean
resolveBeanClass<br>获取Bean的Class
resolveBeforeInstantiation(beanName, mbdToUse)<br><font color="#000000">实例化前的处理</font><br><font color="#ff0000">返回值是一个Bean,如果这里返回不为空,<br>那么后面的步骤就不用了,相当于直接创建了Bean</font><br>
applyBeanPostProcessorsBeforeInstantiation(targetType, beanName)<br><font color="#9c27b0">Bean实例化前回调阶段</font><br>执行InstantiationAwareBeanPostProcessor<br>
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(beanClass, beanName)<br>实例化前 后置处理器
applyBeanPostProcessorsAfterInitialization#(bean, beanName)<br><font color="#f44336">这个是实例化前回调直接返回了bean对象才会调用的,<br>用来弥补初始化后的回调</font><br>执行BeanPostProcessor<br><br>
BeanPostProcessor#postProcessAfterInitialization(result, beanName)<br>初始化后 后置处理器
doCreateBean(beanName, mbdToUse, args)<br>这里就由spring来创建bean的步骤了
createBeanInstance(beanName, mbd, args)<br>创建Bean对象
resolveBeanClass(mbd, beanName)<br>获取Bean的Class
instantiateBean(beanName, mbd)<br><font color="#9c27b0">实例化对象阶段</font><br>这里是简单的一种情况<br>这一步最终创建的是一个BeanWrapper对象(也就是已经实例化了对象)
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)<br><font color="#9c27b0">BeanDefinition合并后回调阶段</font>
判断是否需要添加到三级缓存(单例、允许循环引用,bean正在创建中)<br>
DefaultSingletonBeanRegistry#addSingletonFactory()<br>添加到三级缓存,存的是一个ObjectFactory<br>从二级缓存移除
getEarlyBeanReference(beanName, mbd, bean)<br>三级缓存存的就是这个lamada表达式<br>这个方法是在从三级缓存获取对象时才调用的
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference<br>如果有这个类型的后置处理器,那么就调用他的getEarlyBeanReference<br>没有就直接返回传进来的Bean<br>这个后置处理器主要用来生成代理对象
AbstractAutoProxyCreator#getEarlyBeanReference<br>生成代理对象<br>
populateBean(beanName, mbd, instanceWrapper)<br>给bean的属性赋值
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)<br><font color="#9c27b0">实例化后回调阶段</font><br><font color="#f44336">依赖注入主要的实现有用到</font>
InstantiationAwareBeanPostProcessor#postProcessProperties(pvs, bw.getWrappedInstance(), beanName)<br><font color="#9c27b0">属性赋值前回调阶段</font><br>后面的也一样,只不过是不同版本的api,这个如果返回了null,那么就调用后面的
InstantiationAwareBeanPostProcessor#postProcessPropertyValues<br><font color="#9c27b0">属性赋值前回调阶段</font>
AutowireAnnotationBeanPostProcessor<br>处理@Autowire @Value注解<br>
applyPropertyValues(beanName, mbd, bw, pvs)<br><font color="#9c27b0">属性赋值阶段</font>
initializeBean(beanName, exposedObject, mbd)<br>初始化bean
invokeAwareMethods(beanName, bean)<br><font color="#9c27b0">Aware接口执行阶段</font><br>执行Bean实现的Aware接口(如BeanNameAware)<br>
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)<br><font color="#9c27b0">初始化前回调阶段</font>
BeanPostProcessor#postProcessBeforeInitialization(result, beanName)<br><font color="#f44336">这里的返回结果是会直接替换bean的<br>也就说如果这里返回的对象不是传进去的result,那么就会用返回的对象替换掉之前创建的bean</font>
invokeInitMethods(beanName, wrappedBean, mbd)<br><font color="#9c27b0">初始化阶段</font><br><font color="#616161">这个阶段就是执行初始化方法</font><br>
bean#afterPropertiesSet<br>
自定义的初始化方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)<br><font color="#9c27b0">初始化后回调阶段</font><br>
BeanPostProcessor#postProcessAfterInitialization(result, beanName)<br><font color="#f44336">这里的返回结果也是会直接替换bean的</font><br>
afterSingletonCreation<br>从正在创建的Bean集合中移除
addSingleton(beanName, singletonObject)
singletonObjects.put(beanName, singletonObject)<br>放入单例池<br>
singletonFactories.remove(beanName)<br>从三级缓存中移除
earlySingletonObjects.remove(beanName)<br>从二级缓存中移除
registeredSingletons.add(beanName)<br>将bean名添加到已注册的bean中
0 条评论
下一页