在多模块项目中,我们需要给业务解耦例如:短信,邮件,定时任务等功能需要独立于主业务模块来实现。这时候我们使用 @AutoConfiguration
注解来自动加载我们的功能是一个很好的方式。
万事起于 Hello World,所以我也来写一个示例程序。更好的观察一下这个注解的用法。
我们先去 https://start.spring.io/ 上创建一个 SpringBoot 3.x 基础项目,不需要添加任何的依赖。下载之后删除项目中的 src 目录,修改根 pom.xml
的 packaging
为 pom
模式。 给项目创建两个模块用来区分主模块和其他业务的模块 。最后修改完成结构如下。
我在 platform-common 的模块中创建了一个 platform-common-auto-plan 的模块用来测试这个注解。这时候项目的根 pom.xml 类似下面这样的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.runbrick</groupId>
<artifactId>spring-boot-vue-platform</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<name>spring-boot-vue-platform</name>
<modules>
<module>platform-admin</module>
<module>platform-common</module>
</modules>
<properties>
<!--自 Maven 3.5.0-beta-1 开始可以使用 revision 同意版本号 只能命名成revision,不可以更改成其他命名;-->
<revision>1.0.0</revision>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>3.0.2</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
... 忽略build的内容
</project>
在 platform-common-auto-plan 中开始实现这个自动配置的功能。在 platform-common-auto-plan 项目的 pom.xml 中添加一个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
项目中添加一个 AutoPlanTestConfig.java 文件用来实现自动配置。
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@AutoConfiguration
// 这个注解是用来在 application.yml 中配置 auto-plan.enabled = true 才生效
// 不然是不会加载成功的,这样可以在有一些特殊需要的模块中增加定制化
@ConditionalOnProperty(prefix = "auto-plan", name = "enabled", havingValue = "true")
public class AutoPlanTestConfig {
@Bean
public void planTest() {
System.out.println("这是一个 AutoConfiguration 的测试包,当看到这个证明测试启动成功");
}
}
在 platform-common-auto-plan 的 resources 中添加 META-INF\spring 目录,在该目录中创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,这是 SpringBoot 2.7.0 之后新添加的,3.x 推荐使用这个来代替 spring.factories 在文件中添加上刚才的 AutoPlanTestConfig 。
com.runbrick.common.auto.plan.config.AutoPlanTestConfig
将该 module 的依赖放入 platform-admin 的 pom.xml 中。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.runbrick</groupId>
<artifactId>spring-boot-vue-platform</artifactId>
<version>${revision}</version>
</parent>
<artifactId>platform-admin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.runbrick</groupId>
<artifactId>platform-common-auto-plan</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
将刚才的 auto-plan.enabled = true 加入 application.yml 中
auto-plan:
enabled: true
此时启动 PlatformApplication 即可看到已经加载成功了。
评论区