自动配置原理
自动配置原理
Auto-Configuration
- 它是基于你引入的依赖jar包,对SpringBoot应用进行自动配置
- 他为SpringBoot框架的“开箱即用”提供了基础支撑
术语“配置类”,英文Configuration Class:
- 广义的“配置类”:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括了@Configuration类
- 狭义的“配置类”:特指被注解@Configuration所修饰的某个类,又称为@Configuration类
相关注解
@ComponentScan
@ComponentScan,是来自Spring框架的一个注解:
- 它的作用对指定的package进行扫描,找到其中复合条件的类,默认是搜索被注解@Component修饰的配置类
- 通过属性basePackages或basePackageClasses,来指定要进行扫描的package
- 如果未指定package,则默认扫描当前@ComponentScan所修饰的类所在的package
@Import
是来自Spring框架的一个注解:
- 它的作用是提供了一种显示地从其他地方加载配置类的方法,这样可以避免使用性能较差的组件扫描(ComponentScan)
- 支持导入:- 普通类(这里的普通,是相对随后的两个接口而言的)
- 接口ImportSelector的实现类
- 接口ImportBeanDefinitionRegistrar的实现类
 
@SpringBootApplication
- @SpringBootConfiguration- @Configuration
 
- @EnableAutoConfiguration- @Import(AutoConfigurationImportSelector.class)
 
- @ComponentScan
@SpringBootApplication修饰的类,也会被@Configuration简介修饰,即“原配置类”
SpringBoot框架会对“原配置类”所在的package进行组件扫描(ComponentScan)
SpringBoot框架最终会导入AutoConfigurationImportSelector来实现自动配置
@Conditional
- 它的作用是实现:只有在特点条件满足时,才会向IoC容器注册指定的组件
- 我们可以将@Conditional理解为某种IF语句
常用:
| 注解名称 | 作用 | 
|---|---|
| ConditionalOnBean | 当容器存在指定的Bean时,满足条件 | 
| ConditionalOnMissingBean | 当容器不存在指定的Bean时,满足条件 | 
| ConditionalOnClass | 当classpath中存在指定的类时,满足条件 | 
| ConditionalOnMissingClass | 当classpath中不存在指定的类时,满足条件 | 
自动配置类实例
Redis的自动配置
- 引入依赖
- 配置Redis服务器
- 直接使用RedisTemplate或StringRedisTemplate
| 1 | 
 | 
SpringBoot的启动流程(简化版)
简化版代码
| 1 | public static void run(Class<?> primaryClass){ | 
加载并处理所有的配置类processConfigurationClasses()
| 1 | public static void processConfigurationClasses(ApplicationContext context){ | 
递归函数parse
| 1 | public void parse(Class<?> configClass){ | 
如何实现类AutoConfigurationImportSelector
SpringFactories机制
- Java SPI机制的延伸和扩展
- Spring框架的基础机制,在- Spring以及- SpringBoot源码中到处可见
- 可以基于它来实现SpringBoot的自动配置功能
核心逻辑
从classpath中读取到所有jar包中的配置文件META-INF/spring.factories,然后根据指定的key从配置为念中解析出对应的value值
SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中的配置类型信息加载到Spring容器,并执行类中定义的各种操作
EnableAutoConfiguration,是实现自动装配的重要注解。内部的实际实现是AutoConfigurationImportSelector类来实现,getAutoConfigurationEntry可以返回需要导入的自定义配置,将这些类加载到IOC容器中
在获取的导入配置中,首先会扫描所有的自动配置类,接着根据自定义配置中的ConditionalOnXXX注解做判断,决定是否将其放入最终的导入集合中
例如:
- @ConditionalOnBean
- @ConditionalOnClass
- @ConditionalOnProperty
具体步骤:
- 通过@SpringBootConfiguration引入@EnableAutoConfiguration(负责启动自动配置功能)
- @EnableAutoConfiguration引入了- @Import
- Spring容器启动时:加载IOC容器会解析- @Import注解
- @Import导入了一个- deferredImportSelector,它会使Spring的自动配置类的顺序在最后,这样方便我们扩展和覆盖
- 然后读取所有的/META-INF/spring.factories文件
- 筛选出所有以EnableAutoConfiguration.class为key的、符合条件的配置类,过滤出所有AutoConfigurationClass类型的类
- 最后通过@ConditionOnXXX排除无效的自动配置类
一句话总结,自动配置就是通过扫描jar包下面/META-INF/Spring.factories获取到自动配置,再根据@Conditional按需加载的配置类





