成都個人學(xué)做網(wǎng)站如何推廣小程序平臺
Spring Boot Starter是一種簡化Spring Boot應(yīng)用開發(fā)的機(jī)制,它可以通過引入一些預(yù)定義的依賴和配置,讓我們快速地集成某些功能模塊,而無需繁瑣地編寫代碼和配置文件。Spring Boot官方提供了很多常用的Starter,例如spring-boot-starter-web、spring-boot-starter-data-jpa等,但有時候我們也需要根據(jù)自己的業(yè)務(wù)需求,創(chuàng)建一些自定義的Starter,以便在不同的項目中復(fù)用一些通用的功能或組件。本文將以一個簡單的日期格式化功能為例,介紹如何創(chuàng)建一個自定義的Spring Boot Starter,并說明其原理和使用方法。
一、Starter的命名規(guī)范
在創(chuàng)建一個自定義的Starter之前,我們需要先確定它的名稱。Starter的命名有一種習(xí)慣,官方的Starter一般都是以spring-boot-starter-為前綴,后面跟上模塊名,例如spring-boot-starter-web表示集成了Web開發(fā)相關(guān)的依賴和配置。而我們自定義的Starter一般都是以模塊名為前綴,后面跟上-spring-boot-starter,例如data-spring-boot-starter表示集成了日期格式化相關(guān)的依賴和配置。這樣做的目的是為了避免與官方或其他第三方提供的Starter產(chǎn)生沖突或混淆。
二、Starter項目的結(jié)構(gòu)
創(chuàng)建一個自定義的Starter項目和創(chuàng)建一個普通的Spring Boot項目沒有太大區(qū)別,我們可以使用IDE或者Spring Initializr來快速生成一個基本的項目結(jié)構(gòu)。
一個典型的Starter項目結(jié)構(gòu)如下:
data-spring-boot-starter
├── src
│ ? ├── main
│ ? │ ? ├── java
│ ? │ ? │ ? └── com.data.util
│ ? │ ? │ ? ? ? ├── autoconfigure // 自動配置類所在的包
│ ? │ ? │ ? ? ? │ ? ├── DataAutoConfiguration.java // 自動配置類
│ ? │ ? │ ? ? ? │ ? └── DataProperties.java // 屬性類
│ ? │ ? │ ? ? ? └── util // 業(yè)務(wù)功能類所在的包
│ ? │ ? │ ? ? ? ? ? └──DataUtil.java // 業(yè)務(wù)功能類
│ ? │ ? └── resources
│ ? │ ? ? ? └── META-INF
│ ? │ ? ? ? ? ? └── spring.factories // Spring Boot自動裝配文件
│ ? └── test
│ ? ? ? └── java
├── pom.xml // Maven依賴管理文件
└── README.md // 項目說明文檔
三、Starter項目的依賴
在創(chuàng)建一個自定義的Starter項目時,我們需要在pom.xml文件中添加一些必要的依賴。首先,我們需要添加spring-boot-starter作為基礎(chǔ)依賴,它提供了Spring Boot核心功能和默認(rèn)配置。其次,我們需要添加spring-boot-configuration-processor作為編譯時依賴,它可以幫助我們生成屬性類和配置元數(shù)據(jù),并且設(shè)置為可選依賴,避免傳遞給其他項目。最后,我們需要添加我們要集成的功能模塊相關(guān)的依賴,例如在本例中,我們要集成日期格式化功能,所以我們不需要添加其他額外的依賴。以下是一個示例:
<dependencies><!-- 基礎(chǔ)依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 編譯時依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
</dependencies>
四、Starter項目的屬性類
在創(chuàng)建一個自定義的Starter項目時,我們需要編寫一個屬性類,用來定義我們要集成的功能模塊所需的配置項,并且使用@ConfigurationProperties注解來指定配置文件中的前綴。例如,在本例中,我們要集成日期格式化功能,所以我們需要定義一個日期格式的配置項,并且使用data作為配置文件中的前綴。以下是一個示例:
package com.data.util.autoconfigure;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "data")
public class DataProperties {private String pattern = "yyyy-MM-dd hh:mm:ss"; // 日期格式,默認(rèn)為"yyyy-MM-dd hh:mm:ss"// 省略getter和setter方法
}
五、Starter項目的業(yè)務(wù)功能類
在創(chuàng)建一個自定義的Starter項目時,我們需要編寫一個或多個業(yè)務(wù)功能類,用來實現(xiàn)我們要集成的功能模塊的具體邏輯。例如,在本例中,我們要集成日期格式化功能,所以我們需要定義一個日期工具類,用來根據(jù)配置的日期格式將日期轉(zhuǎn)換為字符串。以下是一個示例:
package com.data.util.util;import java.text.SimpleDateFormat;
import java.util.Date;public class DataUtil {private String pattern; // 日期格式public DataUtil(String pattern) {this.pattern = pattern;}public String dateToStr(Date date){SimpleDateFormat sdf = new SimpleDateFormat(pattern);String format = sdf.format(date);return format;}
}
六、Starter項目的自動配置類
在創(chuàng)建一個自定義的Starter項目時,我們需要編寫一個自動配置類,用來根據(jù)屬性類和業(yè)務(wù)功能類,創(chuàng)建相應(yīng)的Bean對象,并且使用@EnableConfigurationProperties注解來啟用屬性類,這個注解里面?zhèn)魅雽傩灶惖淖止?jié)碼文件。使用@ConditionalOnClass注解來判斷業(yè)務(wù)功能類是否存在,使用@ConditionalOnProperty注解來判斷在對應(yīng)的依賴了該Starter的SpringBoot配置文件中是否有相應(yīng)的配置項。例如,在本例中,我們要集成日期格式化功能,所以我們需要根據(jù)DataProperties和DataUtil,創(chuàng)建一個DataUtil類型的Bean對象,并且使用data.enabled作為配置文件中的開關(guān)項。以下是一個示例:
package com.data.util.autoconfigure;import com.data.util.util.WoniuUtil;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
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;@Configuration
@EnableConfigurationProperties(DataProperties.class)
@ConditionalOnClass(DataUtil.class)
@ConditionalOnProperty(prefix = "data", name = "enabled", havingValue = "true")
public class DataAutoConfiguration {private final DataProperties dataProperties;public DataAutoConfiguration(DataProperties dataProperties) {this.dataProperties = dataProperties;}@Beanpublic DataUtil dataUtil() {return new DataUtil(dataProperties.getPattern());}
}
七、Starter項目的自動裝配文件
在創(chuàng)建一個自定義的Starter項目時,我們需要在resources/META-INF
目錄下創(chuàng)建一個名為spring.factories
的文件,用來指定我們的自動配置類,讓Spring Boot能夠在啟動時自動掃描并加載它。以下是一個示例:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.data.util.autoconfigure.DataAutoConfiguration
八、Starter項目的使用方法
在完成了一個自定義的Starter項目后,我們可以將它打包成jar文件,并且發(fā)布到Maven倉庫或者本地倉庫,這樣就可以在其他項目中引用它了。例如,在本例中,我們可以在其他項目的pom.xml
文件中添加如下依賴:
<dependency><groupId>com.data</groupId><artifactId>data-spring-boot-starter</artifactId><version>1.0.0</version>
</dependency>
然后,在其他項目的配置文件中添加如下配置項:
data:enabled: true # 開啟日期格式化功能pattern: yyyy-MM-dd # 設(shè)置日期格式,可選,默認(rèn)為yyyy-MM-dd hh:mm:ss
最后,在其他項目的代碼中,我們可以通過注入WoniuUtil
類來調(diào)用日期格式化功能。例如:
package com.example.demo;import com.data.util.util.WoniuUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Date;@RestController
public class DemoController {@Autowiredprivate WoniuUtil woniuUtil;@GetMapping("/date")public String date() {Date date = new Date();String str = woniuUtil.dateToStr(date);return str;}
}
這樣,我們就可以通過訪問/date
來獲取格式化后的日期字符串了。
九、Starter項目的原理
Starter項目的核心原理是基于Spring Boot的自動裝配機(jī)制,即根據(jù)類路徑和配置文件中的條件,動態(tài)地創(chuàng)建和注入Bean對象到應(yīng)用上下文中。Starter項目通過在resources/META-INF目錄下創(chuàng)建一個名為spring.factories的文件,來指定自動配置類的全限定名,讓Spring Boot在啟動時能夠掃描并加載它。自動配置類則通過一系列的注解來定義和控制自動裝配的邏輯,例如:
- @Configuration注解標(biāo)識這是一個配置類,用來創(chuàng)建和注冊Bean對象。
- @EnableConfigurationProperties注解啟用屬性類,并將其注入到配置類中。
- @ConditionalOnClass注解判斷類路徑中是否存在指定的類,如果存在則滿足條件。
- @ConditionalOnProperty注解判斷配置文件中是否存在指定的屬性,如果存在并且值與期望相符,則滿足條件。
- @Bean注解根據(jù)屬性類和業(yè)務(wù)功能類,創(chuàng)建相應(yīng)類型的Bean對象,并注冊到應(yīng)用上下文中。
當(dāng)所有的條件都滿足時,Starter項目就能實現(xiàn)自動裝配的功能,讓我們無需手動編寫和配置Bean對象,只需引入依賴和設(shè)置屬性即可。