SpringBoot自定義一個Starter的完整代碼
一、什么是 Spring Boot Starter
Spring Boot Starter 的作用是:
封裝自動配置 + 封裝常用依賴 + 提供開箱即用的功能
很多常見組件其實都是 Starter,例如:
spring-boot-starter-web spring-boot-starter-data-redis spring-boot-starter-security
Starter 的目標是:
使用方只需要引入依賴 + 在 application.yaml 寫配置 + 就可以直接 @Autowired 使用
二、自定義 Starter 的核心結(jié)構(gòu)
核心就三步:
屬性類 → 自動配置類 → 注冊文件
完整結(jié)構(gòu)示例:
my-spring-boot-starter/
├── pom.xml
└── src/main/java/com/example/mystarter/
│ ├── MyService.java
│ ├── MyStarterProperties.java
│ └── MyStarterAutoConfiguration.java
└── src/main/resources/
└── META-INF/spring/
└── org.springframework.boot.autoconfigure.AutoConfiguration.imports三、第1步:屬性類(綁定 application.yaml)
使用 @ConfigurationProperties 綁定配置。
@ConfigurationProperties(prefix = "my.starter")
public class MyStarterProperties {
private String name = "默認名字";
private int timeout = 3000;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}
對應(yīng)的 application.yaml:
my:
starter:
name: 小助
timeout: 5000Spring Boot 會自動把 YAML 配置映射到 MyStarterProperties。
四、第2步:提供服務(wù)類
這是 Starter 對外提供的核心功能。
public class MyService {
private final String name;
private final int timeout;
public MyService(String name, int timeout) {
this.name = name;
this.timeout = timeout;
}
public String sayHello() {
return "你好,我是 " + name + ",超時時間 " + timeout + "ms";
}
}
五、第3步:自動配置類
自動配置類負責(zé)在 Spring Boot 啟動時創(chuàng)建 Bean。
@AutoConfiguration
@EnableConfigurationProperties(MyStarterProperties.class)
public class MyStarterAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyStarterProperties properties) {
return new MyService(
properties.getName(),
properties.getTimeout()
);
}
}
關(guān)鍵邏輯:
讀取配置 ↓ 創(chuàng)建 Bean ↓ 注冊到 Spring 容器
六、第4步:注冊自動配置類
在目錄:
src/main/resources/META-INF/spring/
創(chuàng)建文件:
org.springframework.boot.autoconfigure.AutoConfiguration.imports
內(nèi)容:
com.example.mystarter.MyStarterAutoConfiguration
這一步的作用是:
告訴 Spring Boot 啟動時加載你的自動配置類
七、Starter 的核心依賴
Starter 項目只需要兩個核心依賴:
<dependencies>
<!-- 自動配置核心注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- 生成配置元數(shù)據(jù)(IDE yaml 自動提示) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
</dependencies>八、兩個依賴的作用
| 依賴 | 作用 | 是否必須 |
|---|---|---|
| spring-boot-autoconfigure | 提供 @AutoConfiguration、@ConditionalOnMissingBean、@EnableConfigurationProperties 等注解 | 必須 |
| spring-boot-configuration-processor | 生成 spring-configuration-metadata.json,讓 IDE 提示 yaml 配置 | 可選但建議 |
九、optional 的作用
<optional>true</optional>
含義:
只在編譯 Starter 時使用 不會傳遞給使用方
運行時不需要該依賴。
十、Starter 依賴其他組件
如果 Starter 內(nèi)部需要 Redis:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
當用戶引入你的 Starter 時:
Redis 依賴會自動傳遞
用戶不需要再單獨引入。
十一、Starter 項目 vs Spring Boot 應(yīng)用
| 類型 | Starter 項目 | Spring Boot 應(yīng)用 |
|---|---|---|
| 父工程 | 不需要 | 需要 |
| 主類 | 沒有 main() | 有 @SpringBootApplication |
| 打包 | 普通 jar | 可執(zhí)行 fat jar |
| 是否可運行 | 不能 | 能 |
| 本質(zhì) | 被依賴的庫 | 獨立應(yīng)用 |
十二、Starter 開發(fā)流程
1 創(chuàng)建普通 Maven 項目 2 編寫屬性類(ConfigurationProperties) 3 編寫自動配置類(AutoConfiguration) 4 創(chuàng)建 AutoConfiguration.imports 注冊文件 5 mvn install 6 Spring Boot 項目引入依賴 7 直接 @Autowired 使用
總結(jié)
Spring Boot Starter 的核心就是:
@ConfigurationProperties + AutoConfiguration + AutoConfiguration.imports
完成這三步,就可以實現(xiàn)一個完整的 Spring Boot Starter。
Starter 項目完整 pom.xml 示例
Starter 項目本質(zhì)是一個普通 Maven 項目,只需要少量依賴即可。
完整示例:
<?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.example</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0.0</version>
<properties>
<java.version>17</java.version>
<spring-boot.version>3.5.7</spring-boot.version>
</properties>
<dependencies>
<!-- 核心:自動配置相關(guān)注解(@AutoConfiguration、@ConditionalOnXxx 等) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- 核心:讓 @ConfigurationProperties 編譯時生成元數(shù)據(jù)(IDE 提示 yaml 屬性) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>說明:
spring-boot-autoconfigure 提供自動配置相關(guān)注解 spring-boot-configuration-processor 生成 spring-configuration-metadata.json 讓 IDE 在 application.yaml 中有自動提示
configuration-processor 使用:
<optional>true</optional>
含義是:
只在編譯 Starter 時使用 不會傳遞給使用方項目
因此 Starter 運行時并不依賴該組件。
以上就是SpringBoot自定義一個Starter的完整代碼的詳細內(nèi)容,更多關(guān)于SpringBoot自定義一個Starter的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mybatis?對于生成的sql語句?自動加上單引號的情況詳解
這篇文章主要介紹了mybatis?對于生成的sql語句?自動加上單引號的情況詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
springboot的application.yml配置port不生效的解決方案
這篇文章主要介紹了springboot的application.yml配置port不生效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring中的EventListenerMethodProcessor組件詳解
這篇文章主要介紹了Spring中的EventListenerMethodProcessor組件詳解,EventListenerMethodProcessor 是 Spring 事件機制中非常重要的一個組件,它管理了一組EventListenerFactory組件,用來將應(yīng)用中每個使用@EventListener注解定義的事件監(jiān)聽,需要的朋友可以參考下2023-12-12
JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程
這篇文章主要介紹了JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
SpringBoot實現(xiàn)嵌入式 Servlet容器
傳統(tǒng)的Spring MVC工程部署時需要將WAR文件放置在servlet容器的文檔目錄內(nèi),而Spring Boot工程使用嵌入式servlet容器省去了這一步驟,本文就來設(shè)置一下相關(guān)配置,感興趣的可以了解一下2023-12-12
Windows下Java調(diào)用可執(zhí)行文件代碼實例
這篇文章主要介紹了Windows下Java調(diào)用可執(zhí)行文件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

