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