Springboot的自动配置原理
@SpringbootApplication
@SpringbootApplication
贴了这个注解的类叫做启动类,一般放在根包,一般Springboot项目只有唯一一个启动类 (配置类)
@ComponentScan
包路径扫描 :默认扫描当前包及其子包
@SpringbootConfiguration
包含了@Configuration ,成为配置类
@EnableAutoConfiguration
包含了@Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector.class
--->selectImports()
----->getAutoConfigurationEntry()
---->
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
---->
'META-INF/spring.factories'
------>WebMvcAutoConfiguration
------>@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,...)
---->dispatcherServlet()
Springboot自动原理详解
启动类头顶上贴上@SpringBootApplication注解,可以让我们不需要配置前端控制器,包扫描路径
@SpringBootApplication注解里面有3个核心关键注解
1. @SpringBootConfiguration
头上贴了@Configuration --说明了该类是配置类
2. @ComponentScan :扫描类贴了该注解中所在包及其子包所有贴了版型注解的类,创建对象交给spring容器管理
3. @EnableAutoConfiguration
告诉SpringBoot基于我所添加的依赖,去"猜测"我想如何去配置spring
@EnableAutoConfiguration 下的
@Import(AutoConfigurationImportSelector.class)
:自动配置类选择器,该类可以实现配置类批量载入spring容器 ---->
里面有个方法 getCandidateConfigurations :委托SpringFactoriesLoader去读取jar包中的 "META-INF/spring.factories"文件,加载里面配置的自动配置对象
SpringBoot帮我们配置前端控制器的来源
1.spring.factories文件中配置很多自动配置类,根据条件加载WebMvc/ DataSource/DispatcherServlet 等
以springmvc为例:
在spring.factories 找到 ---> WebMvcAutoConfiguration
里面有 1.@Configuration:声明这是一个配置类
2. @ConditionalOnWebApplication(type = Type.SERVLET) :满足项目的类是是Type.SERVLET类型 (WEB服务)
3.@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) :
OnClass,判断是否引入SpringMVC相关依赖,引入后,当前类配置生效,
即满足Servlet、DispatcherServlet、WebMvcConfigurer类存在
4.@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) :OnMissingBean,指环境中没有指定bean才会生效
5.@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class }) :指定类类加载完后,再加载本类
6.其中DispatcherServletAutoConfiguration.class 配置了前端控制器
--->dispatcherServlet---->new DispatcherServlet();