一、springboot的自动配置原理?
1.通过@SpringBootConfiguration 引入了@EnableAutoConfiguration (负责启动自动配置功能)
2.@EnableAutoConfiguration 引入了@Import
3.Spring容器启动时:加载Ioc容器时会解析@Import 注解
4.@Import导入了一个deferredImportSelector(它会使SpringBoot的自动配置类的顺序在最后,这样方便我们扩展和覆盖?)
5.然后读取所有的/META-INF/spring.factories文件(SPI)
6.过滤出所有AutoConfigurtionClass类型的类
7.最后通过@ConditioOnXXX排除无效的自动配置类
总结一下
- SpringBoot 自动配置就是基于SpringFactories 机制获取对应依赖META-INF目录下的 spring.factories 文件中的需要自动配置的类的全限定名信息,然后根据这些信息将我们需要的使用的 Bean 对象放到 IOC 容器中,当我们需要使用时,通过依赖注入机制直接注入使用即可
二、知识延伸
1、什么是springboot自动配置
springboot通过@enableautoconfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@condition注解指定的条件时,便在依赖的支持下进行实例化,注册到spring容器中。
通俗的来讲,我们之前在写ssm项目时候,配置了大量坐标和配置内容,搭环境的过程在项目开发中占据了大量时间,SpringBoot的最大的特点就是简化了各种xml配置内容,所以springboot的自动配置就是用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。
springboot核心配置原理:
-
自动配置类都存放在spring-boot-autoconfigure-版本号.jar下的org.springframework.boot.autoconfigure中
-
当我们在application.properties中配置debug=true后启动容器。可以看到服务器初始化的初始化配置
-
DispatcherServletAutoConfigratio注册前端控制器
-
EmbeddedServletContainerAutoConfiguration注册容器类型
-
HttpMessageConvertersAutoConfiguration注册json或者xml处理器
-
JacksonAutoConfiguration注册json对象解析器
-
如果加入其他功能的依赖,springBoot还会实现这些功能的自动配置
二、Starter组件
Starter组件是可被加载在应用中的Maven依赖项项。只有在Maven配置中添加对应的依赖配置,即可使用对应的Starter组件。例如,添加spring-boot-starter-web依赖,就可以用于构建RESTAPI服务,其包含了SpringMVC和Tomcat内嵌容器。
一个完整的Starter组件包括以下两点:
-
提供自动配置功能的自动配置模块
-
提供依赖关系管理岗功能的组件模块,即封装了组件所有功能,开箱即用。
三、三大注解
@SpringBootConfiguration:继承自Configuration,支持javaConfig的方式进行配置。
@EnableAutoConfiguration:本文重点讲解,主要用于开启自动配置。
@***ponentScan:自动扫描组件,默认扫描该类所在包及其子包下所有带有指定注解的类,将它们自动装配到bean容器中,会被自动装配的注解包括@Controller、@Service、@***ponent、@Repository等。也可以指定扫描路径。
四、@EnableAutoConfiguration
这个注解是帮助我们自动加载默认配置的,它里面有两个关键注解@AutoConfigurationPackage和@Import,我们来详细了解@Import注解。
@Import(AutoConfigurationImportSelector.class)注解,这里导入AutoConfigurationImportSelector类。这个类中有一个非常重要的方法——selectImports(),它几乎涵盖了组件自动装配的所有处理逻辑,包括获得候选配置类、配置类去重、排除不需要的配置类、过滤等,最终返回符合条件的自动配置类的全限定名数组。
五、SpringFactoriesLoader
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:
loadFactories根据接口类获取其实现类的实例,这个方法返回的是对象列表。
loadFactoryNames根据接口获取其接口类的名称,这个方法返回的是类名的列表。
spring.factories的是通过Properties解析得到的,所以我们在写文件中的内容都是安装下面这种方式配置的:
***.xxx.interface=***.xxx.classname