SpringBoot多模块项目中优雅实现自动配置的完整指南

 更新时间:2026年02月07日 09:08:08   作者:Knight_AL  
在 Spring Boot 开发中,自动配置 是一个绕不开的核心能力,本文将结合一个 RabbitService 自动配置的示例,完整讲解如何在 Spring Boot 多模块项目中实现自动配置,希望对大家有所帮助

在 Spring Boot 开发中,自动配置(Auto Configuration) 是一个绕不开的核心能力。它极大地降低了项目的配置成本,让开发者可以“约定优于配置”,专注于业务逻辑。

多模块项目 中,我们往往会遇到这样一个需求:

  • 希望把一些通用能力(如消息、缓存、工具类等)抽取到公共模块中
  • 其他业务模块只需 引入依赖即可直接使用,而不需要额外 @Import 或手动配置

本文将结合一个 RabbitService 自动配置的示例,完整讲解如何在 Spring Boot 多模块项目中实现自动配置,以及如何通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports来注册自动配置类。

一、什么是 Spring Boot 自动配置

自动配置是 Spring Boot 的核心特性之一。

简单来说就是:

Spring Boot 会根据 当前 classpath 中的依赖,自动判断并注册合适的 Bean 到 Spring 容器中。

自动配置通常具备以下特征:

  • 使用 @Configuration 声明为配置类
  • 配合 @ConditionalOnClass@ConditionalOnProperty 等条件注解
  • 只在“合适的条件下”才生效

这也是 Spring Boot 能做到 “零 XML、少配置” 的根本原因。

二、为什么多模块项目需要自动配置

在多模块项目中,如果没有自动配置,通常会出现这些问题:

公共模块写好了 Bean

每个业务模块都要:

  • 手动 @Import
  • 或扫描指定包

配置分散、侵入性强

可维护性差

自动配置的目标 是:

  • 公共模块只负责“提供能力”
  • 业务模块只需引入依赖即可使用

这正是 Spring Boot 官方推荐的做法。

三、使用 AutoConfiguration.imports 注册自动配置类

Spring Boot 2.7 / 3.x 开始,官方推荐使用:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

来替代早期的 spring.factories

下面通过一个完整示例说明。

四、示例:封装 RabbitService 自动配置模块

定义业务类(RabbitService)

package com.sky.common.rabbit.service;

public class RabbitService {

    public void sendMessage(String exchange, String routingKey, Object message) {
        System.out.println(
            "Message sent to exchange: " + exchange +
            ", routingKey: " + routingKey +
            ", message: " + message
        );
    }
}

这是一个普通的业务类,本身不依赖 Spring。

编写自动配置类

package com.sky.common.rabbit.config;

import com.sky.common.rabbit.service.RabbitService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

@Configuration
public class RabbitServiceAutoConfiguration {

    @Bean
    @ConditionalOnProperty(
        prefix = "sky.security",
        name = "enabled",
        havingValue = "true",
        matchIfMissing = true
    )
    public RabbitService rabbitService() {
        return new RabbitService();
    }
}

这里有几个关键点:

  • 使用 @Configuration 声明配置类
  • 使用 @Bean 注册 RabbitService
  • 使用 @ConditionalOnProperty 控制是否生效

五、注册自动配置类(核心步骤)

公共模块(module-a) 中创建文件:

src/main/resources/
└── META-INF
    └── spring
        └── org.springframework.boot.autoconfigure.AutoConfiguration.imports

内容如下:

com.sky.common.rabbit.config.RabbitServiceAutoConfiguration

这一行配置非常关键

它告诉 Spring Boot:启动时请自动加载这个配置类

只要该模块被引入,Spring Boot 就会自动生效。

六、业务模块中如何使用

module-b 中,只需要引入依赖:

<dependency>
    <groupId>com.sky.common</groupId>
    <artifactId>rabbit</artifactId>
</dependency>

不需要任何额外配置。

直接使用即可:

@RestController
@RequestMapping("/api")
public class Controller {

    @Autowired
    private RabbitService rabbitService;

    @RequestMapping("/send")
    public String sendMessage() {
        rabbitService.sendMessage(
            "donglin",
            "routingKey",
            "Hello, RabbitMQ!"
        );
        return "Message sent!";
    }
}

这就是自动配置的魅力:引入即用

七、为什么不一定要使用 @AutoConfiguration?

很多教程会提到 @AutoConfiguration,但这里要强调一个关键点:

只要配置类被写进 AutoConfiguration.imports 文件,即使没有 @AutoConfiguration 注解,也会被当作自动配置加载

也就是说,下面的写法是 完全合法且有效的

@Configuration
public class RabbitServiceAutoConfiguration {

    @Bean
    @ConditionalOnProperty(
        prefix = "sky.security",
        name = "enabled",
        havingValue = "true",
        matchIfMissing = true
    )
    public RabbitService rabbitService() {
        return new RabbitService();
    }
}

AutoConfiguration.imports 才是“是否自动加载”的决定因素

八、@ConditionalOnProperty 的实际作用

@ConditionalOnProperty(
    prefix = "sky.security",
    name = "enabled",
    havingValue = "true",
    matchIfMissing = true
)

含义解释:

  • sky.security.enabled=true → Bean 生效
  • sky.security.enabled=false → Bean 不加载
  • 配置不存在 → 默认加载(matchIfMissing=true

application.yml 中控制即可:

sky:
  security:
    enabled: true

这使得公共模块既 开箱即用,又 可灵活关闭

九、总结

在 Spring Boot 多模块项目中,使用AutoConfiguration.imports实现自动配置,是一种 官方推荐、优雅、可维护 的方式。

关键要点回顾:

  • 公共模块中定义 @Configuration 配置类
  • 使用条件注解控制 Bean 是否生效
  • AutoConfiguration.imports 中注册配置类
  • 业务模块只需引入依赖即可使用
  • 不强制要求 @AutoConfiguration 注解

这种方式非常适合:

  • 基础组件模块
  • 通用能力封装
  • 中台 / 平台型项目

到此这篇关于SpringBoot多模块项目中优雅实现自动配置的完整指南的文章就介绍到这了,更多相关SpringBoot多模块配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中list根据id获取对象的几种方式

    Java中list根据id获取对象的几种方式

    这篇文章主要给大家介绍了关于Java中list根据id获取对象的几种方式,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 一文快速掌握Spring Cloud Stream

    一文快速掌握Spring Cloud Stream

    这篇文章主要介绍了Spring Cloud Stream详解,本篇文章所涉及到的demo练习使用的cloud 2021.0.3+ springboot2.6.8,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • SpringBoot使用Kafka来优化接口请求的并发方式

    SpringBoot使用Kafka来优化接口请求的并发方式

    这篇文章主要介绍了SpringBoot使用Kafka来优化接口请求的并发方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • spring boot+vue 的前后端分离与合并方案实例详解

    spring boot+vue 的前后端分离与合并方案实例详解

    这篇文章主要介绍了spring boot+vue 的前后端分离与合并方案实例详解,需要的朋友可以参考下
    2017-11-11
  • Mybatis执行流程、缓存原理及相关面试题汇总

    Mybatis执行流程、缓存原理及相关面试题汇总

    最近刚学完MyBatis,趁着大好机会,总结一下它的执行流程,面试也爱问这个,下面这篇文章主要给大家介绍了关于Mybatis执行流程、缓存原理及相关面试题的相关资料,需要的朋友可以参考下
    2022-02-02
  • java 同步器SynchronousQueue详解及实例

    java 同步器SynchronousQueue详解及实例

    这篇文章主要介绍了java 同步器SynchronousQueue详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • idea tomcat乱码问题的解决及相关设置的步骤

    idea tomcat乱码问题的解决及相关设置的步骤

    这篇文章主要介绍了idea tomcat乱码问题的解决及相关设置的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java多线程编程必备volatile与synchronized深入理解

    java多线程编程必备volatile与synchronized深入理解

    这篇文章主要介绍了java多线程编程必备volatile与synchronized的深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Spring事务的七种传播行为

    Spring事务的七种传播行为

    这篇文章主要介绍了Spring事务的七种传播行为,文章围绕主题的相关资料展开详细的内容解说,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 巧妙的利用Mongodb做地理空间查询

    巧妙的利用Mongodb做地理空间查询

    本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论