SpringBoot自动配置的8个技巧分享

 更新时间:2025年01月03日 08:28:26   作者:猿java  
在 SpringBoot 2.x中,一个很核心的功能是自动配置机制,这篇文章主要为大家详细介绍了Spring Boot 2.x 实现自动配置的8个技巧,希望对大家有所帮助

在 SpringBoot 2.x中,一个很核心的功能是自动配置(Auto-Configuration)机制,这篇文章,我们来聊一聊 Spring Boot 2.x 实现自动配置的8个宝藏技巧,希望帮助你更好地掌握SpringBoot的自动配置原理。

1. 核心注解:@EnableAutoConfiguration

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

@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 存在时生效。

示例:

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {

    @Bean
    public DataSource dataSource() {
        // 创建并返回默认的数据源
    }
}

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

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

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

自定义 Bean:如果开发者在上下文中定义了某个 Bean,而自动配置类又尝试定义同类型的 Bean,通常开发者自定义的 Bean 会优先于自动配置的 Bean。

排除自动配置:可以在 @SpringBootApplication@EnableAutoConfiguration 注解中使用 exclude 属性来排除特定的自动配置类。

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication { ... }

配置属性:通过在 application.propertiesapplication.yml 中设置特定的配置属性,可以启用、禁用或自定义自动配置的行为。

5. SpringBoot Starter

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

常见的 Starter 示例:

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

6. AutoConfigurationImportSelector 与组装自动配置

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

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

7. 调试与诊断自动配置

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

spring-boot-starter-actuator:包含的 auto-configure 端点可以展示应用的自动配置报告。

@EnableAutoConfigurationreport 日志:在启动日志中显示哪些自动配置被应用或被排除。

spring.autoconfigure.exclude 属性:可以在配置文件中指定要排除的自动配置类。

8. 自定义自动配置

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

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

创建自动配置类:使用 @Configuration 和适当的 @Conditional 注解。

@Configuration
@ConditionalOnClass(MyService.class)
public class MyServiceAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

spring.factories 中注册:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyServiceAutoConfiguration

发布 Starter:将自动配置类打包在一个 Starter 中,供其他项目引入使用。

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

9. 总结

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

到此这篇关于SpringBoot自动配置的8个技巧分享的文章就介绍到这了,更多相关SpringBoot自动配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatisPlus中批量删除的示例代码

    mybatisPlus中批量删除的示例代码

    本文主要介绍了mybatisPlus中批量删除的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 创建并运行一个java线程方法介绍

    创建并运行一个java线程方法介绍

    这篇文章主要介绍了创建并运行一个java线程,涉及线程代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring Boot项目优雅上线之日志、监控、异常处理最佳实践指南

    Spring Boot项目优雅上线之日志、监控、异常处理最佳实践指南

    要让Spring Boot项目优雅、稳健地上线并持续高效运行,日志、监控、异常处理就是那不可或缺的 仪表盘、导航和故障预警系统,是我们必须重视的关键环节,这篇文章主要介绍了Spring Boot项目优雅上线之日志、监控、异常处理最佳实践指南的相关资料,需要的朋友可以参考下
    2026-05-05
  • java 避免出现NullPointerException(空指针)的方法总结

    java 避免出现NullPointerException(空指针)的方法总结

    这篇文章主要介绍了java 避免出现NullPointerException(空指针)的方法总结的相关资料,需要的朋友可以参考下
    2017-09-09
  • java分页之假分页实现简单的分页器

    java分页之假分页实现简单的分页器

    这篇文章主要介绍了java分页之假分页实现简单的分页器的相关资料,需要的朋友可以参考下
    2016-04-04
  • Java中的ArrayList类常用方法和遍历

    Java中的ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的ArrayList类常用方法和遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 一次踩坑记录 @valid注解不生效 排查过程

    一次踩坑记录 @valid注解不生效 排查过程

    这篇文章主要介绍了一次踩坑记录 @valid注解不生效 排查过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • IDEA2022版本创建maven web项目的两种方式详解

    IDEA2022版本创建maven web项目的两种方式详解

    创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式,本文结合实例代码给大家介绍了IDEA2022版本创建maven web项目的两种方式,需要的朋友可以参考下
    2023-02-02
  • Java中File类方法详解以及实践

    Java中File类方法详解以及实践

    Java File类的功能非常强大,利用java基本上可以对文件进行所有操作,下面这篇文章主要给大家介绍了关于Java中File类方法以及实践的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • SpringBoot集成Validation参数校验

    SpringBoot集成Validation参数校验

    这篇文章主要为大家详细介绍了SpringBoot集成Validation参数校验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论