为什么要开发专用的Spring Boot Starter
Spring在通常使用时,一般是通过pom.xml
文件中引入相关的jar包,然后再通过application.yml
文件配置初始化bean的配置,但随着项目越来越复杂或是项目组中的应用数量越来越多,可能会带来几个问题:
- jar包依赖越来越多;
- 同一jar包的版本在不同的应用中可能不一样,甚至会发生冲突依赖;
- 自定义的配置没有相应的文档辅助,导致很多配置无从查找,进而可能会出现应用中重复开发;
- 最终,导致项目组中技术基线不统一,而且在很长一段时间内很难统一;
上述问题的解决方案有两种,一是定义一个通用的pom.xml,但公用的pom.xml也存在维护等问题,另一个问题是基础的pom.xml只是一个maven依赖配置,无法携带公用的java代码。
所以最好的解决文案就是采用自定义的starter。
开发步骤
1. 新建Maven项目,在项目的POM文件中定义使用的依赖;
2. 新建配置类,写好配置项和默认的配置值,指明配置项前缀;
4. 新建自动装配类,使用@Configuration和@Bean来进行自动装配;
5. 新建spring.factories文件,指定Starter的自动装配类;
自定义的 Spring Boot Starter实现
自定义的Spring Boot Starter就是一个普通的spring项目,下面就一步步来实现。
创建工程
创建一个springboot类型的模块。如下图所示,一路默认即可:
pom.xml依赖
这里的pom.xml依赖没有太严格的要求,就是按需引入,比如你在自定义的starter中实现了一些功能,比如jdbc操作mysql功能,那么是肯定要引入mysql-driver.jar驱动包的,因为这样才能做到版本统一管理,
但统一建议添加<optional>true</optional>
不传递。这样防止多层依赖时冲突的发生。如下:
- Starter 命名规则,即
artifactId
命名规则:Spring 官方定义的 Starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-data-mongodb。Spring 官方建议,非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,myjson-spring-boot-starter。
<?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>
<!-- starter坐标 -->
<groupId>com.korgs</groupId>
<artifactId>korgs-framework-spring-boot-starter</artifactId>
<name>framework-springboot-starter</name>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!--编译版本,这个一定要指定 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 功能依赖,scope按需添加,但注意添加optional=true,不强制但建议 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.2.4</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>3.2.4</version>
<scope>annotationProcessor</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>annotationProcessor</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
AppConfig自定义配置类实现
这个示例中,只是为了演示,如何在application.yml文件中添加自定义的配置,因为自定义的starter除了做maven管理外,另一个主要目的就是实现一些基础的功能(可配置)。
package com.korgs.framework.starter;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
@Data
@ConfigurationProperties(prefix = "framework.config")
public class AppConfig {
String appRegisterName;
/*可以通过这种方式实现一次功能上的扩展,总之是和正常的项目开发没太大区别*/
/*@Bean
public AppServer appServer(){
return new AppServer(appRegisterName);
}*/
}
spring.factories配置
在src/resources/META-INF/
目录下新建一个名为spring.factories
的文件,META-INF
这个目录需要手动创建一下,添加以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.korgs.framework.starter.AppConfig
spring.factories文件的作用是,springboot启动时会扫描jar下的spring.factories文件,如果发现了就根据配置内容执行相应的初始化工作。
工程打包
最后运行 mvn -clear install
安装在本地maven缓存中,测试好了之后可以发布到公司的maven私服上面。
测试自定义的 Spring Boot Starter
再新建一个springboot工程,然后引入上面的自定义starter包。比如:
<dependency>
<groupId>com.korgs</groupId>
<artifactId>korgs-framework-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
application.properties配置
这时在application.properties
中配置时,如果是idea就会有提示功能(但这并不是最重要的):
AppConfig配置类测试
其实上面自定义的starter就是一个普通的配置类,和本模块中代码实现一样,比如: