03. Spring Framework 获取 Bean 流程
2022-02-26 09:49:51 0 举报
AI智能生成
Spring 创建 bean 流程
作者其他创作
大纲/内容
getSingleton(beanName)
此时获取不到返回 null
getMergedLocalBeanDefinition()
获取 bean 的定义信息
处理 @DependsOn 情况
它可以用来处理 bean 之间的依赖关系
它可以用来处理 bean 之间的依赖关系
getSingleton(beanName, () -> createBean(beanName, mbd, args))
beforeSingletonCreation(beanName)
添加到【singletonObjects】集合中表示正在创建
添加到【singletonObjects】集合中表示正在创建
singletonFactory.getObject()
通过上一步传入的匿名内部类创建 bean 对象
通过上一步传入的匿名内部类创建 bean 对象
createBean(beanName, mbd, args)
创建 bean 对象
resolveBeforeInstantiation(beanName, mbdToUse)
给 BeanPostProcessors 一个机会来返回一个代理对象,而不是目标 bean 的实例
如果返回了 bean 实例,那么下面的 doCreateBean() 方法就会跳过,很多逻辑也不会再执行,慎用
当然这个方法一般也不会用到
如果返回了 bean 实例,那么下面的 doCreateBean() 方法就会跳过,很多逻辑也不会再执行,慎用
当然这个方法一般也不会用到
applyBeanPostProcessorsBeforeInstantiation()
调用【InstantiationAwareBeanPostProcessor】的 postProcessBeforeInstantiation() 方法
applyBeanPostProcessorsAfterInitialization()
调用当前容器里所有 BeanPostProcessors 的 postProcessAfterInitialization() 方法
这一步是有执行条件的,只有当前面返回了一个对象,才会触发
这一步是有执行条件的,只有当前面返回了一个对象,才会触发
AbstractAutowireCapableBeanFactory.doCreateBean(beanName, mbdToUse, args)
真正的创建对象方法
createBeanInstance(beanName, mbd, args)
使用构造方法创建 bean 实例
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
determineCandidateConstructors()
调用【SmartInstantiationAwareBeanPostProcessor】的 determineCandidateConstructors() 方法
这个方法的作用是查找使用哪个构造器来创建 bean 对象
这个方法的作用是查找使用哪个构造器来创建 bean 对象
根据上一步筛选出的构造器
这里直接通过反射执行 bean 的构造方法,创建对象
这里直接通过反射执行 bean 的构造方法,创建对象
applyMergedBeanDefinitionPostProcessors()
调用【MergedBeanDefinitionPostProcessor】的 postProcessMergedBeanDefinition() 方法
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))
向三级缓存 【singletonFactories】存一份 ObjectFactory(() -> getEarlyBeanReference(beanName, mbd, bean))
从二级缓存 【earlySingletonObjects】移除
从二级缓存 【earlySingletonObjects】移除
populateBean()
给属性赋值
postProcessAfterInstantiation()
调用【InstantiationAwareBeanPostProcessor】的 postProcessAfterInstantiation() 方法
在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置都是 null,
此方法决定下面的步骤要不要为属性进行赋值
在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置都是 null,
此方法决定下面的步骤要不要为属性进行赋值
postProcessProperties()
调用【InstantiationAwareBeanPostProcessor】的 postProcessProperties() 方法
在属性被设置到 bean 实例中之前,我们有机会拦截属性,并更改属性
在属性被设置到 bean 实例中之前,我们有机会拦截属性,并更改属性
postProcessPropertyValues()
调用【InstantiationAwareBeanPostProcessor】的 postProcessPropertyValues() 方法
可以在该方法内对属性值进行修改,此方法已经废弃,推荐使用 postProcessProperties()
可以在该方法内对属性值进行修改,此方法已经废弃,推荐使用 postProcessProperties()
applyPropertyValues()
通过上面解析出来的属性值为 bean 进行赋值,真正的赋值操作
initializeBean()
执行 bean 的初始化方法,包含三种,依次是:
@PostConstruct、afterPropertiesSet()、initMethod()
invokeAwareMethods(beanName, bean)
执行 Aware 接口方法,包含这三种【BeanNameAware】、【BeanClassLoaderAware】、【BeanFactoryAware】接口
applyBeanPostProcessorsBeforeInitialization()
执行所有【BeanPostProcessor】的 postProcessBeforeInitialization() 方法
执行 bean 的初始化方法
执行 bean 的初始化方法
invokeInitMethods(beanName, wrappedBean, mbd)
继续执行初始化方法
继续执行初始化方法
((InitializingBean) bean).afterPropertiesSet()
执行实现了 InitializingBean 接口的 afterPropertiesSet() 方法
执行实现了 InitializingBean 接口的 afterPropertiesSet() 方法
invokeCustomInitMethod(beanName, bean, mbd)
执行 @Bean 标注的 initMethod 的初始化方法
执行 @Bean 标注的 initMethod 的初始化方法
applyBeanPostProcessorsAfterInitialization()
执行所有【BeanPostProcessor】的 postProcessAfterInitialization() 方法
校验是否能从二级缓存【earlySingletonObjects】中获取到之前提前暴露的 bean 对象
如果可以获取到,需要与赋值后的 bean 对象进行比较
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
如果不发生循环依赖,从二级缓存中是获取不到值的,所以这里就不会抛出异常
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
如果不发生循环依赖,从二级缓存中是获取不到值的,所以这里就不会抛出异常
getSingleton(beanName, false)
此时获取不到返回 null
registerDisposableBeanIfNecessary(beanName, bean, mbd)
注册 Bean 的销毁方法
addSingleton(beanName, singletonObject)
从二级缓存【earlySingletonObjects】移除
向一级缓存【singletonFactories】添加 bean 对象
从三级缓存【singletonFactories】移除从二级缓存【earlySingletonObjects】移除
0 条评论
下一页