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