前言:
我将springboot的自动配置看作两个阶段
- 加载spring.factories文件
- 读取自动配置类默认配置信息,读取被覆盖的配置信息
第一阶段:加载spring.factories
首先追踪程序入口中的run方法
在里面发现了SpringApplication构造器里面有初始化的方法
我继续跟踪
找到了名为"获取spring工厂实例"的方法,并且在里面有一个加载工厂名字的方法,于是我继续跟踪下去
在官方的注释上我看见了熟悉的内容:"META-INF/spring.factories" 于是点开注释,发现这是一个常量
至此,自然产生了疑问"这个文件有和特殊之处,里面有什么东西呢?"
于是我到依赖中查找这个文件
发现以autoconfigure结尾的依赖,猜想如果查看这个依赖应该会更清晰
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
...
# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
...
# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
...
发现官方注解 "# Auto Configure"
并在里面发现了属性的WebMvc
来到了第二阶段
第二阶段:读取自动配置类默认信息&需要覆盖的配置信息
点开发现在这个类里面有一些默认的mvc配置信息
同时还存在下面这样一个内部类
在方法中发现这个配置试图解析器的方法,于是想要看一下mvcProperties这个属性是做什么的(其实这里根据名字xxProperties已经猜出个大概,是与配置文件有关)
找到它点开一看,豁然开朗
这不就是和读取配置文件有关吗
到这里应该就能理解为什么在配置文件中我们配置名称是固定的
因为springboot在做自动配置时会将通过配置文件中固定的名称获取到配置信息从而覆盖默认配置
比如:
#默认日期格式
spring.mvc.format.date=dd/MM/yyyy
#自定义日期格式
spring.mvc.format.date=dd-MM-yyyy
补充:
源码中通过spring.factories文件拿到了所有自动配置的类
通过BeanUtils
将这些类实例化
因为run方法有返回值所以我拿到了它返回的对象,发现了很多方法,里面可以通过getXxx()直接获取实例化的bean