Bean Definition 生成过程详解

目录

 

1、目标:

2、整体预览:

3、bean Definition的种类分析

4、第一类bean Definition(框架硬编码的)

5、第二类bean Definition(程序员自己写的bean,比如被@component标注的对象)

6、第三类:beanDefinition获取;

 

 


1、目标:


个人认为spring项目启动过程主要分为两步,一个是bean Definition的获取,一个通过bean Definition生成bean。但是由于过程十分复杂我们先分析bean Definition的获取。

2、整体预览:

 

3、bean Definition的种类分析

第一类:框架编写过程中硬编码到容器中的,大概是6个;

第二类:使用spring框架的程序员自己写的bean,比如被@component标注的对象;

第三类:从classpath视实际情况而自动装载的一些bean。包括tomcat 相关的,http相关的等;

第四类:mapper对象,这里特意和第一类分开因为在之后的分析中也是单独分析的;

 

4、第一类bean Definition(框架硬编码的)

 

Bean Definition 生成过程详解_第1张图片

在容器初始化过程中,系统硬编码了6个bean Definition。从命名上我们可以大致知道这些bean Definition都是干啥的。
0、ConfigurationClassPostProcessor internalConfigurationAnnotationProcessor// 处理@Configuration注解
1、internalAutowiredAnnotationProcessor//处理@autowire注解
2、internalRequiredAnnotationProcessor//处理@required注解
3、internalCommonAnnotationProcessor//处理其他普通注解注解
4、internalEventListenerProcessor//事件监听处理器
5、internalEventListenerFactory//事件监听工厂

Bean Definition 生成过程详解_第2张图片

7、internalCachingMetadataReaderFactory 

5、第二类bean Definition(程序员自己写的bean,比如被@component标注的对象)

 

6、beanName=demoApplication(启动类)这个也归类为程序员自己写的。

Bean Definition 生成过程详解_第3张图片

这段调用    ConfigurationClassPostProcessor# processConfigBeanDefinitions 首先通过扫描的方式从classpath下导入bean定义。但是这一步仅仅是导入了那些类上明确标注为bean 的。而其他形式的bean比如@bean 标注在方法上,或者import引入 这些都会在下文loadbeanDefinition 提到。 

6、第三类:beanDefinition获取;

这个类型主要是通过方法  loadBeanDefinitionsForConfigurationClass()获取,所以从方法上看这是一种从Configuration中获取。那么Configuration包括用户自己定义的一些配置,也包括框架定义的。所以这个第三类其实是包含了部分第二类的。

Bean Definition 生成过程详解_第4张图片

这些Configuration主要是来自程序员定义的,和框架内部配置文件配置的。 上图右边的一大块都是属于Configuration。如何读入这些配置可以参考这个模块

Bean Definition 生成过程详解_第5张图片

我们把所有Configuration类粘贴下

 

最后附上本文截图的详细地址可供参考。

https://www.processon.com/view/link/5e847d98e4b07b16dcdb8a46

 

 

你可能感兴趣的:(spring原码)