Springboot扫描注解类

Springboot扫描注解类的入口在AbstractApplicationContext的refresh中,对启动步骤不太了解的,可参考https://blog.csdn.net/leadseczgw01/article/details/128930925

Springboot扫描注解类_第1张图片
Springboot扫描注解类_第2张图片
Springboot扫描注解类_第3张图片
Springboot扫描注解类_第4张图片

BeanDefinitionRegistryPostProcessor接口有多个实现类,扫描Controller、Service等组件,这里使用的是ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry。

Springboot扫描注解类_第5张图片
Springboot扫描注解类_第6张图片

查看processConfigBeanDefinitions方法中的parser.parse(candidates),作用为解析所有@Configuration类,所有组件注解都包含@Configuration,实际就是解析

所有组件。

Springboot扫描注解类_第7张图片

下图,如果BeanDefinition属于AnnotatedBeanDefinition,就开始解析注解bean定义。

Springboot扫描注解类_第8张图片
Springboot扫描注解类_第9张图片
Springboot扫描注解类_第10张图片

在处理配置类的注解时,会找到ComponentScans注解,并解析其内容(@SpringBootApplication注解就包含@ComponentScan),由于未配置basePackages属性,解析到最后使用声明的类名。

Springboot扫描注解类_第11张图片
Springboot扫描注解类_第12张图片

后面扫描包,通过查看doScan方法的实现类,可以看到有两个,一个是ClassPathBeanDefinitionScanner(spring),另一个是ClassPathMapperScanner(使用mybatis集成的)。

Springboot扫描注解类_第13张图片

这里使用的是ClassPathBeanDefinitionScanner的doscan方法。

Springboot扫描注解类_第14张图片

扫描basePackage下的组件。

Springboot扫描注解类_第15张图片
Springboot扫描注解类_第16张图片

再对beanDefinition做一些后置处理。

Springboot扫描注解类_第17张图片
Springboot扫描注解类_第18张图片
Springboot扫描注解类_第19张图片

上面完成了初步的BeanDefinition构建,在checkCandidate方法中将决定是否注册该BeanDefinition。

Springboot扫描注解类_第20张图片
Springboot扫描注解类_第21张图片
Springboot扫描注解类_第22张图片

调用registerBeanDefinition方法开始注册BeanDefinition。

Springboot扫描注解类_第23张图片
Springboot扫描注解类_第24张图片

DefaultListableBeanFactory的registerBeanDefinition方法中进行注册。

Springboot扫描注解类_第25张图片

判断是否开始了bean创建。

Springboot扫描注解类_第26张图片

已经有2个框架类开始创建,进入synchronized方法块进行添加。

Springboot扫描注解类_第27张图片
Springboot扫描注解类_第28张图片

注册完bean definition后同时给bean name注册别名。

Springboot扫描注解类_第29张图片

关于BeanDefinition中的class是如何加装的,请查看ConfigurationClassPostProcessor类的processConfigBeanDefinitions方法。

Springboot扫描注解类_第30张图片

ConfigurationClassBeanDefinitionReader的loadBeanDefinitionsForConfigurationClass

Springboot扫描注解类_第31张图片

经过多个方法调用后,使用 ClassUtils.forName(className, classLoader)加载class

Springboot扫描注解类_第32张图片

这里Class.forName的initialize设置为false,只是与class文件进行了关联,还未初始化,初始化在后面。

Springboot扫描注解类_第33张图片

你可能感兴趣的:(java,spring,boot,java,spring)