起步依赖
即Maven的依赖传递
自动配置
作用
- SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发
方案
- 问题1、
@SpringBootApplication
注解会自动对所在包以及子包进行组件扫描,使@Component
等Bean相关组件生效,而除此之外的范围则无法生效
- 方案1:在启动类上手动加上
@ComponentScan(XXX)
手动指定要扫描的包,但是过于繁琐
- 方案2:使用
@Import(xxx.class)
导入,可以
- 导入普通类
- 导入配置类
- 导入
ImportSelector
接口实现类
- 第三方依赖自己提供
@EnableXxxx
注解,封装@Import
注解,不用启动类事先知道类名,而是由第三方依赖决定
原理(源码跟踪)
SpringBootApplication注解 - 自动配置原理
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
封装了一个@Configuration
注解,也是为什么@SpringBootApplication
可以定义Bean对象的原因,说明当前类也是配置类
- 封装了一个
@ComponentScan
,是@SpringBootApplication
可以对包及其子包进行扫描的原因
@EnableAutofiguration
,自动配置相关注解,底层代码如下:

- 其中使用
@Import
导入接口实现类AutoConfigurationImportSelector
,该类实现了DeferredImportSelector
接口,而该接口继承至ImportSelector
接口,其中有方法selectImports
,会返回需要导入到IOC容器中的类的全类名,DeferredImportSelector接口重写了selectImports方法,如下:

- 根据最后返回结果涉及Configuration,追溯源码,可得到如下:

- 说明会从
META-INF/spring/
下的某文件进行全类名导入,一是spring.factories
,是早期springboot进行配置的文件;而在2.7.0之后,则使用.AutoConfiguration.imports
文件进行配置

- 上述文件中包含很多类的全类名,也包括一些类的自动配置类,这也说明了为什么SpringBoot能实现自动配置
条件配置
- 在自动配置类中定义Bean对象时,会使用
@ConditionalOnMissingBean
进行条件配置,是一个父注解,具有以下子注解:

- 在
AutoConfiguration.imports
文件中,自动配置类都会添加配置条件决定该类是否生效,实现动态灵活配置