springIOC-spring源码详解(二)

2023-02-08 00:00:00 创建 专区 调用 实例 则是

映入眼帘,源码里是大家都熟悉的三个方法,首先执行的是this(),调用构造函数,

通过AnnotatedBeanDefinitionReader这里会读取很多重要的初始类,

ConfigurationClassPostProcessor就是在这里注册,不然我们后面无法通过注解来解析和注册bean。

这个类实现了我们上篇文章说的两个接口,

BeanFactoryPostProcessor和BeanFactoryPostProcessorRegister。

前面说的都是注册成功配置类,后面在refresh()里开始解析配置类。

这里面会解析@bean,@importResource,@import,@ComponentScan。

后面finishBeanFactroyInitialization(beanFactory)实例化我们剩余的单例bean。

在实例化单实例的代码如上,先会通过freezeConfiguration冻结bean属性,禁止修改,其实就是把configurationFrozen参数改为false。

PreInstantiateSingletons()里先获取所有的beanNames,然后判断不是抽象,是单例,不是懒加载的进入。

当这里定义的bean没有实现factoryBean的时候,则走下面的getBean()。

前面的markBeanAsCreated就是标记当前bean正在创建的状态。

后面getDependsOn()则是当bean有@dependsOn注解的时候,会优先加载despendsOn的bean。

这里createBean则还是创建bean,在之前getSingleton会把bean标记成正在创建,解决循环依赖的时候,正在创建很关键。

这里开始调用一些扩展的后置处理器,调用完之后还是正式创建bean。

调用完成之后开始实例化bean。

实例化通过反射和工厂,反射通过@component直接作用在类上,spring实例化。工厂则是通过new的方法,比如@bean+configuration。

getEarlyBeanRefrence解决循环依赖的。

之后popuateBean填充属性,调用set方法进行赋值。

相关文章