问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring Boot自动配置的8个关键技巧

创作时间:
作者:
@小白创作中心

Spring Boot自动配置的8个关键技巧

引用
CSDN
1.
https://m.blog.csdn.net/stone_tmp/article/details/144895374

Spring Boot的自动配置机制是其核心功能之一,通过一系列智能的条件判断、依赖管理和配置文件支持,Spring能够根据项目的实际需求自动装配所需的组件和Bean。本文将深入解析Spring Boot 2.x自动配置的8个关键技巧,帮助开发者更好地掌握这一机制。

1. 核心注解:@EnableAutoConfiguration

自动配置的启用主要通过@EnableAutoConfiguration注解实现,通常,这个注解被包含在@SpringBootApplication中:

public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@SpringBootApplication等同于组合了以下三个注解:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

2. 自动配置类的注册:spring.factories

Spring Boot使用spring.factories文件(位于各个自动配置模块的META-INF目录下)来注册所有的自动配置类。具体来说,@EnableAutoConfiguration注解会触发AutoConfigurationImportSelector,它会读取spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration键对应的所有自动配置类,并将其导入到应用上下文中。

示例spring.factories内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

3. 条件装配:@Conditional注解

自动配置类通常使用各种@Conditional注解来决定是否应用特定的配置。这些条件基于类路径中的类、存在的Bean、配置属性等。常见的条件注解包括:

  • @ConditionalOnClass: 当指定的类存在于类路径上时生效。
  • @ConditionalOnMissingBean: 当指定的Bean不存在时生效。
  • @ConditionalOnProperty: 当特定的配置属性满足条件时生效。
  • @ConditionalOnBean: 当指定的Bean存在时生效。

示例:

@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
    public DataSource dataSource() {
        // ...
    }
}

上述配置表示:如果DataSource类在类路径中存在,并且上下文中尚未定义DataSourceBean,则自动配置一个默认的数据源。

4. 自动配置的优先级与覆盖

虽然自动配置会根据条件自动配置很多Bean,但开发者可以通过以下方式覆盖默认配置:

  • 自定义Bean:如果开发者在上下文中定义了某个Bean,而自动配置类又尝试定义同类型的Bean,通常开发者自定义的Bean会优先于自动配置的Bean。
  • 排除自动配置:可以在@SpringBootApplication@EnableAutoConfiguration注解中使用exclude属性来排除特定的自动配置类。
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
    // ...
}
  • 配置属性:通过在application.propertiesapplication.yml中设置特定的配置属性,可以启用、禁用或自定义自动配置的行为。

5. Spring Boot Starter

Spring Boot Starter是一组依赖描述符(通常是Maven或Gradle依赖),它们聚合了一组相关的依赖项。通过引入特定的Starter,自动配置机制会检测到相关的依赖,并根据需要应用相应的自动配置。

常见的Starter示例:

  • spring-boot-starter-web: 包含了构建Web应用所需的依赖,如spring-webmvc、Tomcat等,并触发相关的自动配置(如DispatcherServlet、Tomcat等)。
  • spring-boot-starter-data-jpa: 包含了JPA相关的依赖,并触发数据源、JPA实体管理器等的自动配置。

6. AutoConfigurationImportSelector与组装自动配置

AutoConfigurationImportSelector@EnableAutoConfiguration背后的关键类。它负责读取spring.factories文件中的自动配置类,并应用到Spring应用上下文中。流程如下:

  1. 解析spring.factories:读取所有在spring.factories中注册的自动配置类。
  2. 评估条件:对于每个自动配置类,评估其@Conditional注解,决定是否应用该配置。
  3. 导入配置类:将符合条件的自动配置类导入到应用上下文中。

7. 调试与诊断自动配置

Spring Boot提供了一些工具和特性,帮助开发者理解和调试自动配置:

  • spring-boot-starter-actuator:包含的auto-configure端点可以展示应用的自动配置报告。
  • @EnableAutoConfiguration的report日志:在启动日志中显示哪些自动配置被应用或被排除。
  • spring.autoconfigure.exclude属性:可以在配置文件中指定要排除的自动配置类。

8. 自定义自动配置

作为开发者,我们也可以创建自定义的自动配置类,以便在特定条件下自动配置特定的Bean。

下面列举了核心的3个步骤:

  1. 创建自动配置类:使用@Configuration和适当的@Conditional注解。
@Configuration
@ConditionalOnClass(MyService.class)
public class MyServiceAutoConfiguration {
    @Bean
    public MyService myService() {
        return new MyService();
    }
}
  1. 在spring.factories中注册
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyServiceAutoConfiguration
  1. 发布Starter:将自动配置类打包在一个Starter中,供其他项目引入使用。

通过上面3个核心步骤,当我们在启动Spring Boot容器时,自定义的类就会被自动配置,实现我们要达到的预期。

总结

本文分析了Spring Boot 2.x自动配置的8个关键技巧,通过一系列智能的条件判断、依赖管理和配置文件支持,Spring能够根据项目的实际需求自动装配所需的组件和Bean。这极大地简化了Spring应用的配置过程,使得开发者能够更专注于业务逻辑的实现,而无需关心繁琐的配置细节。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号