起步依赖
即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文件中,自动配置类都会添加配置条件决定该类是否生效,实现动态灵活配置