什么是Spring自动配置:Auto-Configuration:
自动配置指的是基于你引入依赖的jar包,对SpringBoot应用进行自动配置
它为SpringBoot框架的"开箱即用"特点提供了基础支撑
举个例子:在SpringBoot中使用Redis
只需要以上三步就可以直接使用redisTemplate等Bean对象,整个过程中SpringBoot自动完成了Redis的自动配置,将相关的Bean对象注册到IOC容器中了
SpringBoot的启动流程
自动配置作为SpringBoot启动的一个流程,我们先看一下简单的SpirngBoot启动大概做了些什么?
SpringBoot的启动流程(简略版)
1:实例化ApplicationContext(),也就是ioc容器,是Spring中核心接口和容器,允许容器通过应用程序上下文环境创建,获取,管理Bean
2:向IOC容器中,注册加载源配置类,即被@SpringBootApplication注解修饰的类,它是遍历所有配置类的起点,
3:加载处理所有配置类,SpringBoot会自动找到所有配置类,本文自动装配就是在这个环节进行
4:实例化所有单例Bean,依赖注入(DI)和自动装配就是在这个一部
5:如果是web应用,SpringBoot会启动内置tomcat服务器
如何进行自动配置
自动装配流程
步骤一:Ioc容器中取出源配置类
步骤二:从源配置类开始,通过@ComponentScan和@Import注解,不断的去发现自己写的配置类,直到没有为止,将得到的配置类集合进行处理,注册到Ioc容器中,如下图
图解递归处理所有的配置类
SpringBoot自动配置的原理分析
先说结论,SpringBoot使用@Import注解,导入一个ImportSelector,从而实现了自动配置的功能
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration //配置类注解
@EnableAutoConfiguration //启动自动配置注解
@ComponentScan( //组件扫描注解
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootApplication注解
该图为@SpringBootApplication的内部注解,其核心注解为@SpringBootConfiguration,@EnableAutoConfiguration,@CompoentScan 三个注解
@SpringBootConfiguration:为@SpringBootApplication注解下的配置类注解,其内部含有@Configuration注解,表示该类是一个配置类,即源配置类
@CompoentScan:SpringBoot框架对“源配置类”所在的“package”进行组件扫描
@EnableAutoConfiguration:开启自动配置,导入AutoConfigurationImportSelector选择器来实现自动配置,如下图
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) //实现自动配置
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
导入AutoConfigurationImportSelector选择器
如何实现AutoConfigurationImportSelector选择器
利用Spring框架中的SpringFactories机制,
SpringFactories机制
它的核心逻辑是从classpath中读取到所有Jar包中的配置文件META-IF/spring.factories,
然后根据指定的key 从配置文件中解析出对应的value值
Spring.factories配置文件执行流程
所有可以总结一下 AutoConfigurationImportSelector实现流程
AutoConfigurationImportSelector实现流程
总结一下
SpringBoot自动配置的流程