spring源码-refresh中的prepareBeanFactory
AbstractApplicationContext中的prepareBeanFactory

准备bean工厂在上下文中使用

set类加载器,将我们当前线程的类加载器设置进去
再设置了spel表达式解析器,等到后续会被evaluateBeanDefinitionString时会被调用进行解析spel表达式
set一个ResourceEditorRegister这个是用来做xml赋初始值的一个类型转换
比如说如图所示,我们给name赋值,那么能够成功因为他是一个string类型,而给date类型赋值则会失败,这时候我们就需要使用到这个ResourceEditorRegister的类型转换,这就是属性注册编辑器的功能
这三个就是为beanFactory添加的一些小工具
看下面的

addBeanPostProcessor,先remove再add,为了去重

我们再看它的参数,进入查看一番
我们想要去了解这个方法做了一些什么,得结合未来怎么使用这些属性来看

未来会调用到postProcessBeforeInitialization

bean不属于这些aware的话直接返回,如果有实现则往下执行,最终都会执行invokeAwareInterface

简单看一眼,就是做一些装配
当然有before那就肯定有after,一个就是在初始化前的postProcessor一个是初始化后的postProcessor
总流程就是说,在invokeBeanFactoryPostProcessor中会doCreateBean的方法,最终会落到applyBeanPostProcessorsBeforeInitialization和after最后就会落到我们的这两个方法上,可以自己打个断点查看一下
那我们再回过来看,这里add的东西是不是就是准备能够被aware捕获到并且执行前面的before和after方法的PostProcessor

后面那些ignoreDependencyInterface是什么意思呢?


这就是选择忽略的理由
我们再看下面的代码

想了解这一段我们首先了解一下下面这段

那么我们可以怎么解决?
第一种方法添加一个@primary主类
第二种方法就是通过复写,添加一个beanFactory.registerResolvableDependency(Inter.class,new A());此时就将A与Inter绑定在了一起

那么上面这四个也是同样的做绑定
继续

到这一块他也是添加自己的处理器来支持某些操作

能看到addApplicationListener增加监听器
那么这就是ApplicationListenerDetector的功能,在被初始化after需要增加监听器
最后一段

首先就是LTW,进不去,没有使用到代码编织
然后是三个相同的结构,主要就是判断是否包含三个环境属性之类的,将他们单独的做成一个单例bean能够被获取,比如说进行getBean(environment)

那么我们debug进入一下

是不是就是environment,那么后面那两个也一样
继续进入

刚开始注册,那么肯定不抛异常,进入到addSingleton中

singletonObjects是一级缓存
singletonFactories是三级缓存,一旦被获取去进行依赖注入了就可以remove防止内存泄漏
earlySingletonObjects是二级缓存需要remove
registeredSingletons是已经注册的单例bean的名称

下一个方法,函数式编程,它是这样子工作的

set.add就是action.accept,第二个参数就是判断条件

这时之前这个父类被初始化并且传入的参数,在前面几篇有讲过,但是这里是不包含传进来的beanName:environment,所以进入判断并且执行set.add

向manualSingletonNames.add(environment)
最后进入clear

里面就清除了两个属性

那么我们只看到了clear,怎么没看到往里put啊?我们搜索一下this.allBeanNamesType

这里进行这个方法了put,这个方法如果是通过by type查找,那么就会被调用,从而进入三目运算符来判断到底是存储在单例中还是all中

这样我们就了解了结构

调了三次注册singleton,同样的,被清空三次
那么到此就完成了prepareBeanFactory(beanFactory);方法,他发挥的是什么作用,首先set了当前线程的classloader,再提供了spel解析,又提供了类型转换的解析,然后add了一个processor,他会在bean被初始化前调用当前AwareProcessor的beforebean初始化方法
然后进行忽略aware,避免出现被注入两次的问题,然后将一些比较顶级的接口和实例做绑定,避免出现不知道注入谁的问题,然后又添加一个processor,这个Detector处理的是after,和AwareProcessor类似的步骤,最后支持一下LTW代码编织,并且注册环境属性,系统环境bean,以上

浙公网安备 33010602011771号