# Spring Boot是什么
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
# Spring Boot的优点
- 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
- 开箱即用,远离繁琐的配置。
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
- 没有代码生成,也不需要XML配置。
- 避免大量的 Maven 导入和各种版本冲突。
# Spring Boot自动配置原理
SpringBoot 项目的一切都要从 @SpringBootApplication
这个注解开始说起。
@SpringBootApplication
标注在某个类上说明:
- 这个类是 SpringBoot 的主配置类。
- SpringBoot 就应该运行这个类的 main 方法来启动 SpringBoot 应用。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}
可以看到SpringBootApplication
注解是一个组合注解,其主要组合了一下三个注解:
@SpringBootConfiguration
:该注解表示这是一个 Spring Boot 的配置类,其实它就是一个@Configuration
注解而已。@ComponentScan
:开启组件扫描。@EnableAutoConfiguration
:从名字就可以看出来,就是这个类开启自动配置的。嗯,自动配置的奥秘全都在这个注解里面。
先看该@EnableAutoConfiguration
注解是怎么定义的 ,
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
}
@AutoConfigurationPackage
注解就是将主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器中。@Import({AutoConfigurationImportSelector.class})
该注解给当前配置类导入另外的 N 个自动配置类。
进入类AutoConfigurationImportSelector
,观察其selectImports
方法,这个方法执行完毕后,Spring会把这个方法返回的类的全限定名数组里的所有的类都注入到IOC容器中。具体分析这个方法。
第一行
if
时会首先判断当前系统是否禁用了自动装配的功能,如果当前系统禁用了自动装配的功能则会返回如下这个空的数组,后续也就无法注入bean了。此时如果没有禁用自动装配则进入else分支,第一步操作首先会去加载所有Spring预先定义的配置条件信息,这些配置信息在
org.springframework.boot.autoconfigure
包下的META-INF/spring-autoconfigure-metadata.properties
文件中。这些配置条件主要含义大致是这样的:如果你要自动装配某个类的话,你觉得先存在哪些类或者哪些配置文件等等条件,这些条件的判断主要是利用了
@ConditionalXXX
注解。获取
@EnableAutoConfiguration
注解上的exclude
、excludeName
属性,这两个属性的作用都是排除一些类的。加载整个项目所有的
spring.factories
文件。删除重复的自动配置类,去除我们指定排除的配置类。
根据加载的配置条件信息来判断各个配置类上的
@ConditionalXXX
系列注解是否满足需求。最后就是发布自动装配完成事件,然后返回所有能够自动装配的类的全限定名。