映入眼帘,源码里是大家都熟悉的三个方法,首先执行的是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方法进行赋值。
这里判断当接口实现了InitializingBean,则会调用bean。@postConstruct,实现intializingBean和initMethod方法。