绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
springIOC-spring源码详解(二)
2023-02-08 10:08:41

映入眼帘,源码里是大家都熟悉的三个方法,首先执行的是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方法进行赋值。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

MySQL干货资料
创建时间:2020-05-06 14:18:32
每天都有干货输出哦
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~