自动配置原理
-
SpringBootApplication
- 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。
- @SpringBootConfiguration:该注解与@Configuration注解作用一样,用来声明当前类为一个配置类
- @ComponentScan:组件扫描,默认扫描当前启动类所在包及其子包
- @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解
- 该注解是个复合注解,其中封住了一个@Import注解,指定注入到SpringIOC容器中的ImportSelector接口的实现类。
- 具体参照文章:SpringBoot原理-自动配置-方案_熵240的博客-CSDN博客
- 该实现类中实现了该接口(ImportSelector)中selectImports方法,该方法的返回值是我们要导入到IOC容器中的全类名的集合,
- 在该方法中加载了两个文件 META-INF/spring和org.springframework.boot.autoconfigure.AutoConfiguration.imports
-
META-INF/spring目录:这个目录下的文件是Spring Boot自动配置的核心配置文件。在这个目录下,可以定义多个配置文件,每个配置文件对应一个自动配置类。这些配置文件使用了Spring的SPI(Service Provider Interface)机制,通过SpringFactoriesLoader加载并实例化自动配置类。
-
org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:这个文件定义了需要自动导入的其他自动配置类。在自动配置类中,可以使用@Import注解来导入其他自动配置类。而在AutoConfiguration.imports文件中,可以列出需要自动导入的自动配置类的全限定类名,这样在启动时,Spring Boot会自动将这些自动配置类导入到容器中
-
- 在imports文件中会定义非常多的自动配置类,配置类当中也会定义很多bean对象,我们可以通过注解来设置将bean对象装配到IOC容器的条件。具体参见文章:SpringBoot原理-自动配置-原理分析-@Conditional_熵240的博客-CSDN博客
- 该注解是个复合注解,其中封住了一个@Import注解,指定注入到SpringIOC容器中的ImportSelector接口的实现类。
- 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。
小结
- 自动装配简单讲就是将第三方的bean以及配置类装载到IOC容器中,开发人员就不再需要写bean的配置了,自动装配的实现只需要在启动类上加入@SpringBootApplication注解就可以了,而@SpringBootApplication注解是一个复合注解,其中自动装配的实现是通过@EnableAutoConfiguration注解实现的,自动装配的实现主要依靠三个关键的技术。
- 第一,引入Starter,启动依赖组件的时候,该组件中必须含有@Configuration配置类,在这个配置类中,我们需要通过@Bean注解去声明要装配到IOC容器中的Bean对象
- 第二,上述配置类是放在第三方的jar包里面,然后通过SpringBoot中约定优于配置的理念去把配置类的全路径放在
META-INF/spring.factories
文件中,由此SpringBoot就可以知道第三方jar包里面配置类的位置,当Spring Boot启动时,会通过SpringFactoriesLoader加载META-INF/spring.factories文件中定义的自动配置类。然后根据条件注解的判断,决定是否需要进行自动配置。 - 第三,SpringBoot拿到所有第三方jar包里面声明的配置类之后,在通过Spring提供的ImportSelector接口来实现对于这些配置类的动态加载,从而完成自动装配。该接口的实现类由@EnableAutoConfiguration注解中包含的@Import注解来指定。通过实现该中String[] selectImports()方法,该方法的返回值为需要装入Spring IOC容器中类。