文章目录
- [一、什么是 Spring Boot 自动配置?](#一、什么是 Spring Boot 自动配置?)
- 二、为什么多模块项目需要自动配置?
- [三、使用 AutoConfiguration.imports 注册自动配置类](#三、使用 AutoConfiguration.imports 注册自动配置类)
- [四、示例:封装 RabbitService 自动配置模块](#四、示例:封装 RabbitService 自动配置模块)
- 五、注册自动配置类(核心步骤)
- 六、业务模块中如何使用?
- [七、为什么不一定要使用 @AutoConfiguration?](#七、为什么不一定要使用 @AutoConfiguration?)
- [八、@ConditionalOnProperty 的实际作用](#八、@ConditionalOnProperty 的实际作用)
- 九、总结
在 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 自动配置模块
1️⃣ 定义业务类(RabbitService)
java
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。
2️⃣ 编写自动配置类
java
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
内容如下:
properties
com.sky.common.rabbit.config.RabbitServiceAutoConfiguration
📌 这一行配置非常关键
它告诉 Spring Boot:
启动时请自动加载这个配置类
只要该模块被引入,Spring Boot 就会自动生效。
六、业务模块中如何使用?
在 module-b 中,只需要引入依赖:
xml
<dependency>
<groupId>com.sky.common</groupId>
<artifactId>rabbit</artifactId>
</dependency>
不需要任何额外配置。
直接使用即可:
java
@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 注解,也会被当作自动配置加载
也就是说,下面的写法是 完全合法且有效的:
java
@Configuration
public class RabbitServiceAutoConfiguration {
@Bean
@ConditionalOnProperty(
prefix = "sky.security",
name = "enabled",
havingValue = "true",
matchIfMissing = true
)
public RabbitService rabbitService() {
return new RabbitService();
}
}
📌 AutoConfiguration.imports 才是"是否自动加载"的决定因素
八、@ConditionalOnProperty 的实际作用
java
@ConditionalOnProperty(
prefix = "sky.security",
name = "enabled",
havingValue = "true",
matchIfMissing = true
)
含义解释:
sky.security.enabled=true→ Bean 生效sky.security.enabled=false→ Bean 不加载- 配置不存在 → 默认加载(
matchIfMissing=true)
在 application.yml 中控制即可:
yaml
sky:
security:
enabled: true
这使得公共模块既 开箱即用 ,又 可灵活关闭。
九、总结
在 Spring Boot 多模块项目中,使用
AutoConfiguration.imports
实现自动配置,是一种 官方推荐、优雅、可维护 的方式。
关键要点回顾:
- 公共模块中定义
@Configuration配置类 - 使用条件注解控制 Bean 是否生效
- 在
AutoConfiguration.imports中注册配置类 - 业务模块只需引入依赖即可使用
- 不强制要求
@AutoConfiguration注解
这种方式非常适合:
- 基础组件模块
- 通用能力封装
- 中台 / 平台型项目