spring源码-refresh中的onRefresh方法和finishBeanFactoryInitialization方法

到了refresh方法了

进入查看方法体,发现没有方法体

同样的,它和postProcessBeanFactory方法一样都是模板方法模式,都是由子类去复写,springboot框架就复写了这个方法,到时候直接去看springboot里的这个方法






再来看finishBeanFactoryInitialization方法的源码,这里就是初始化nonLazy的单例bean

进入查看

这里取判断了是否存在ConversionService这个bean,那么这个bean是干什么的呢?

它是一个spring的类型转换器的总容器,我们可以将一个ArrayList转换成TestBean,这是我们写的convert

然后我们将自定义的convert加入到总容器中,并且调用convert获得返回的TestBean

能够正常拿到TestBean

那么我们回来看这一块代码,

这一块不会进入,因为我们没有注册一个ConversionService这个bean,我们是直接通过getSharedInstance获取到的一个静态实例

那么我们接着来看下一块

判断beanFactory的嵌套属性解析器,这是什么?

那么我们没有提前注册过这个if就会进入,这个嵌套属性解析器,spring就会自动的进行添加,为我们的spring添加一个小工具用来解析占位符(什么情况下会提前注册,举个例子,比如说你想要再postProcessor中解析占位符,但是嵌套属性解析器的加载是在执行postProcessor之后的,那么我们需要进行手动的进行添加)

下一个模块,还是我们的LTW,代码编织

没有使用到,那么这一段会直接跳过

再来看最后一块

先将临时类加载器置空,然后冻结配置,如何进行冻结

首先将冻结标识设置为true表示已经冻结了,然后将我们之前创建的BeanDefinitionNames放到冻结的这个List里,表示我们马上要去做bean的初始化,那么这些beanDefintion已经被冻结了,不能再做其他操作

到此为止,前面都是对初始化的一个准备

最后一个方法preInstantiateSingletons要做初始化了

进入查看怎么初始化的

首先获取到我们前面冻结时展示过的BeanDefinitionNames,然后对这些BeanDefinitionNames做循环,拿到每个BeanDefinition

这里的getMergedLocalBeanDefinition它们的核心作用是 处理父子 BeanDefinition 的合并 返回的是父子合并后的RootBeanDefinition,然后判断是否抽象,是否单例,是否懒加载,我们这里都没有,所以直接会调用getBean进行初始化,同样的我们将getBean放到后面再讲,那么这一块for循环就是这么一个作用

接下来一块是

如果我们想要在bean初始化完成之后做一些操作怎么办?第一种就是BeanPostProcessor的after方法,第二种就是这里的SmartInitializingSingleton

它只有一个after方法

beanPostProcessor的bean可以是所有scope的bean,而SmartInitializingSingleton是专门为我们的singleton的bean来做的after

这里我们就只有EventListenerMethodProcessor能够进来

对这些进行遍历判断是否startwith

是否是作用域代理,那么这些都不是

通过我们beanFactory和beanName获取Bean的实际类型而不是BeanDefinition

然后看一下是不是AssignableFrom,这里就是处理对scope proxy的特殊情况,尝试去获取真实类,我们的类并不是scope proxy继续往下到processBean

processBean负责扫描指定 Bean 中所有@EventListener注解的方法,并将其转换为ApplicationListener注册到 Spring 容器中

做了三层校验,扫描过且不含EventListener避免重复解析,候选检查,快速判断是否含有EventListener,跳过spring内部容器类,所以spring所有的内部类都会直接跳过,直到我们自定义的类

做方法的拦截并扫描方法,深度扫描类继承体系中的所有方法并且处理注解继承和组合,说白了这个方法就是扫描方法上有没有EventListener注解的

如果没有的话直接将该类加入黑名单,然后跳过

这就是EventListenerMethodProcessor在初始化之后想要完成的事情

posted @ 2025-05-25 16:44  七森星罗  阅读(21)  评论(0)    收藏  举报