Spring Boot 之自定义Starter
没有调查就没有发言权!
做JavaEE开发的小伙伴们肯定听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置
spring boot 中也为我们提供了丰富的starter
- spring-boot-starter-web:快速构建基于Spring MVC的Web项目,使用Tomcat做默认嵌入式容器。
- spring-boot-starter-data-redis:操作Redis。
- pring-boot-starter-data-jpa:操作Mysql。
- spring-boot-starter-activemq:操作Activemq。
- ......
今天我们就来看下spring boot 自定义starter
开发Starter步骤:
- 创建Starter项目
- 定义Starter需要的配置(Properties)类
- 编写自动配置类
- 编写spring.factories文件加载自动配置类
- 编写配置提示文件spring-configuration-metadata.json(不是必须的)
一、建立自定义starter
1、创建Starter项目
父pom如下:
记得更新repositories地址
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jarvan</groupId>
<artifactId>test-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>test-starter</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<my-starter.version>1.0.0-SNAPSHOT</my-starter.version>
</properties>
<modules>
<module>my-starter</module>
<module>client-starter</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.jarvan</groupId>
<artifactId>my-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>nexus</id>
<url>http://192.168.1.xxx:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>releases</id>
<name>releases Repository</name>
<url>http://192.168.1.xxx:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://192.168.1.xxx:8081/repository/maven-snapshots/</url>
<uniqueVersion>true</uniqueVersion>
</snapshotRepository>
</distributionManagement>
</project>
starter的pom如下
<?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>
<parent>
<artifactId>test-starter</artifactId>
<groupId>com.jarvan</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>my-starter</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2、定义starter配置类
package com.jarvan.mystarter.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author zjw
*/
@Data
@Component
@ConfigurationProperties("jarvan.user")
public class UserProperties {
private String name;
private Integer age;
}
3、编写自动配置类
package com.jarvan.mystarter.config;
import com.jarvan.mystarter.module.UserClient;
import com.jarvan.mystarter.properties.UserProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* @author zjw
*/
@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfiguration {
@Bean
# 如果是多个可以用ConditionalOnProperty来控制哪些放入到spring容器中,一个可以用注解或者spring.factories来控制
@ConditionalOnProperty(prefix = "jarvan.user", value = "enabled", havingValue = "true")
public UserClient userClient(UserProperties userProperties) {
return new UserClient(userProperties);
}
}
4、编写spring.factories文件加载自动配置类
注意点:因为starter通常是没有启动类的,所以starter的pom中不能有spring-boot-maven-plugin打包配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jarvan.mystarter.config.UserAutoConfiguration
二、使用自定义starter
1、创建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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jarvan</groupId>
<artifactId>test-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>com.jarvan</groupId>
<artifactId>client-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>client-starter</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.jarvan</groupId>
<artifactId>my-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jarvan</groupId>
<artifactId>my-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、注入UserClient
@RestController
public class UserController {
@Autowired
private UserClient userClient;
@GetMapping("/user/name")
public String getUserName() {
return userClient.getName();
}
}
3、写配置文件
jarvan:
user:
name: zjw
age: 25
enabled: true #starter中默认为true,可以手动指定是否开启
4、启动starter并测试
注意:如果注入显示 Could not autowire. No beans of 'UserClient' type found. 在启动类上增加@ComponentScan(basePackages = "com.userClient包路径")
三、注解方式引入
有时我们不想引入了Starter包就自动注入,想让用记来操作是否开启注入,比如常用的@EnableAsync这个注解就是用于开启调用方法异步执行的功能。
如果用注解的方式,那么spring.factories就不需要编写了,下面使用自定义注解来确定是否注入UserClient。
1、增加自定义注解 @EnableUserClient
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({UserAutoConfiguration.class})
public @interface EnableUserClient {
}
2、启动类增加 @EnableUserClient
测试demo整体结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人