Spring Boot 自动配置是指,在 Spring Boot 中,通过一些规则来自动配置应用程序所需的 Bean、服务和其他组件。这种自动配置的方式可以大大减少开发人员的工作量,因为他们不需要手动配置每个组件,而只需要在应用程序中引入所需的模块即可。
Spring Boot是一个基于Spring框架的开源Java平台,其主要优势在于能够简化新Spring应用的初始搭建以及开发过程。自动配置是Spring Boot的一个核心特性,它通过少量的配置工作,就能快速启动和运行Spring应用程序。下面将逐步分析如何实现Spring Boot的自动配置:
1. 依赖管理
Spring Boot使用Maven或Gradle作为构建工具,并通过spring-boot-starter依赖来管理项目所需的库。每个starter都包含了一组方便的依赖描述符,在项目中加入这个starter来获得Spring Boot和相关的库。
2. @SpringBootApplication注解
当创建一个Spring Boot应用时,通常会在主类上添加@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration,@EnableAutoConfiguration,@ComponentScan等注解。其中,@EnableAutoConfiguration是自动配置的关键。该注解会去 spring-boot-autoconfigure 工程下寻找 META-INF/spring.factories 文件,此文件中列举了所有能够自动装配类的清单,然后自动读取里面的自动装配配置类清单。
3. 自动配置类
Spring Boot在启动时会自动扫描所有的jar包,并查找META-INF/spring.factories文件。在这个文件中,可以通过org.springframework.boot.autoconfigure.EnableAutoConfiguration键指定配置类的全限定名。Spring Boot会根据这些自动配置类来进行项目的自动配置。
自动配置类给容器中使用 @Bean 放一堆组件。每个自动配置类都可能有这个注解 @EnableConfigurationProperties(xxxProperties.class) ,用来把配置文件(application.xml或application.properties)中配的指定前缀的属性值封装到 xxxProperties属性类中。
4. 条件注解
@EnableAutoConfiguration通过 @Import来作用,项目启动的时候利用 @Import 批量导入组件机制把 autoconfigure 包下的所有 xxxAutoConfiguration 类导入进来(自动配置类),虽然导入这些自动配置类,并不是所有的自动配置类都能生效,按需生效,每一个自动配置类,都有条件注解,只有条件成立,才能生效。自动配置类中的bean定义通常会使用@Conditional注解的条件注解来进行条件化的创建。这些条件注解包括@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty等,它们会根据类路径、bean的存在与否、属性值等条件来决定是否创建某个bean。
常用的 Conditional 注解:
@ConditionalOnClass : classpath 中存在该类时起效
@ConditionalOnMissingClass : classpath 中不存在该类时起效
@ConditionalOnBean : DI 容器中存在该类型 Bean 时起效
@ConditionalOnMissingBean : DI 容器中不存在该类型 Bean 时起效
@ConditionalOnSingleCandidate : DI 容器中该类型 Bean 只有一个或 @Primary 的只有一个时起效
@ConditionalOnExpression : SpEL 表达式结果为 true 时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的 JNDI 存在时起效
@ConditionalOnJava : 指定的 Java 版本存在时起效
@ConditionalOnWebApplication : Web 应用环境下起效
@ConditionalOnNotWebApplication : 非 Web 应用环境下起效
5. 自定义自动配置
如果需要自定义自动配置,可创建一个配置类,并使用 @Configuration 注解。在 src/main/resources/META-INF/spring.factories 文件中添加你的配置类。使用 @Conditional 注解的条件注解来控制配置类的加载条件。
6.小结
启动类中有一个 @SpringBootApplication 注解,包含了 @SpringBootConfiguration、 @EnableAutoConfiguration , @EnableAutoConfiguration 代表开启自动装配,注解会去 spring-boot-autoconfigure 工程下寻找 META-INF/spring.factories 文件,此文件中列举了所有能够自动装配类的清单,然后自动读取里面的自动装配配置类清单。因为有 @Conditional 条件注解,满足一定条件配置才会生效,否则不生效。 如: @ConditionalOnClass(某类.class) 工程中必须包含一些相关的类时,配置才会生效。所以说当我们的依赖中引入了一些对应的类之后,满足了自动装配的条件后,自动装配才会被触发。
自动配置流程图