目录
5、第二类bean Definition(程序员自己写的bean,比如被@component标注的对象)
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(框架硬编码的)
在容器初始化过程中,系统硬编码了6个bean Definition。从命名上我们可以大致知道这些bean Definition都是干啥的。
0、ConfigurationClassPostProcessor internalConfigurationAnnotationProcessor// 处理@Configuration注解
1、internalAutowiredAnnotationProcessor//处理@autowire注解
2、internalRequiredAnnotationProcessor//处理@required注解
3、internalCommonAnnotationProcessor//处理其他普通注解注解
4、internalEventListenerProcessor//事件监听处理器
5、internalEventListenerFactory//事件监听工厂
7、internalCachingMetadataReaderFactory
5、第二类bean Definition(程序员自己写的bean,比如被@component标注的对象)
6、beanName=demoApplication(启动类)这个也归类为程序员自己写的。
这段调用 ConfigurationClassPostProcessor# processConfigBeanDefinitions 首先通过扫描的方式从classpath下导入bean定义。但是这一步仅仅是导入了那些类上明确标注为bean 的。而其他形式的bean比如@bean 标注在方法上,或者import引入 这些都会在下文loadbeanDefinition 提到。
6、第三类:beanDefinition获取;
这个类型主要是通过方法 loadBeanDefinitionsForConfigurationClass()获取,所以从方法上看这是一种从Configuration中获取。那么Configuration包括用户自己定义的一些配置,也包括框架定义的。所以这个第三类其实是包含了部分第二类的。
这些Configuration主要是来自程序员定义的,和框架内部配置文件配置的。 上图右边的一大块都是属于Configuration。如何读入这些配置可以参考这个模块
我们把所有Configuration类粘贴下
最后附上本文截图的详细地址可供参考。
https://www.processon.com/view/link/5e847d98e4b07b16dcdb8a46