創(chuàng)建SpringBoot自動配置:自定義Starter項目
創(chuàng)建SpringBoot自動配置項目
經(jīng)過前面章節(jié)的學習,我們已經(jīng)了解了 Spring Boot 的核心運作原理,同時也學習了幾個常用框架的自動配置機制及源代碼解析。Spring Boot 默認實現(xiàn)了許多的 starter,可以在項目中快速集成。但如果我們所需的 starter 并不在其中,又想借鑒 Spring Boot 的 starter 的創(chuàng)建機制來創(chuàng)建自己框架 starter,該怎么辦呢?本章將帶領大家創(chuàng)建一個自定義的 starter 項目。
在具體實踐的過程中我們會經(jīng)常遇到這樣的情況,比如幾個項目都需要發(fā)送短信驗證碼的子項目(針對大多數(shù)沒有采用服務化的場景)。那么,最笨的方法就是每個項目中都重新寫一份執(zhí)行程序, 或者更進一步是創(chuàng)建一 個單獨的子項目,然后每個項目都依賴 jar 包。如果項目采用的是 Spring Boot 的項目框架,那事情就會變得更加簡單,這時候 Spring Boot 的自動配置便派上用場了
下面,我們就以發(fā)送短信驗證碼這樣的場景來自定義- -個 starter.在此之前,我們先總結一下之前講解的自動配置 starter 的基本條件。
首先,需要在 classpath 中存 在用于判斷是否進行自動配置的類;然后,當滿足這些條件之后,需要通過自定義的 Bean 將其實例化并注冊到容器中;最后,這一過程通過 Spring Boot自動配置的機制自動完成。關于自動配置機制的實現(xiàn),我們已經(jīng)在前面章節(jié)中詳細講述過了。

自定義SpringBootStarter項目
這里通過 maven 項目管理工具進行 starter 的創(chuàng)建。首先創(chuàng)建一個簡單的 maven 項目,該項目可通過 Intellj idea 等 IDE 進行創(chuàng)建,也可通過 maven 命令進行創(chuàng)建。創(chuàng)建之后項目的目錄結構如下。
-一 spring - boot-starter-msg. iml
-main
test在完成了項目的創(chuàng)建和基礎依賴的添加之后,便開始相應功能的實現(xiàn)。首先,創(chuàng)建一個MsgService 類。該類不僅提供了短信發(fā)送的功能實現(xiàn),也會被用于 Spring Boot 判斷是否進行自動配置的核心類。而后者的場景就是 SpringBoot 用于檢查 classpath 中是否存在該類。
<dependency>
<groupId>org. spri ngframework . boot< / groupId>
<artifactId>spring- boot - autoconfigure artifactId>
<version>2.2.1. RELEASEversion>
dependency>在 MsgService 中用到了一一個工具類 HttpClientUtils。在 HttpClientUtils 這里僅以打印請求的參數(shù)信息用作示例,生產(chǎn)環(huán)境中根據(jù)具體場景進行實現(xiàn)。
public class HttpClientUtils {
public static int sendMsg(String url, String accessKeyId, String accessKe
Secret, String msg) {
// TODO 調用指定 url 進行請求的業(yè)務邏輯
System. out . println("Http 請求,url=" + url + ";accessKeyId=" + accessKey
Id +
";accessKeySecret=" + accessKeySecret + ";msg=" + ms
g)
return 0; }}完成了基礎的功能類實現(xiàn)之后,下一步提供自動配置的屬性配置類 MsgProperties,它的作用是封裝 application.properties 或 application.yml 中的基礎配置。在這里就是關于短信發(fā)送的基礎參數(shù),前綴統(tǒng)一采用 msg, 通過@ConfigurationProperties 注解來進行對應屬性的裝配。
@ConfigurationProperties(prefix = "msg")
public class MsgProperties {
/**
訪問發(fā)送短信的 url 地址
private String url;
/**
短信服務商提供的請求 keyId
private String accessKeyId;
/**
短信服務商提供的 KeySecret
private String accessKeySecret;
//省略 getter/setter 方法
}有了屬性配置類和服務類,下面就是通過自動配置類將其整合, 并在特定條件下進行實例化操作。自動配置類本質上就是一個普通的 Java 類 ,通過不同的注解來對其賦予不同的功能。
@Configuration
@ConditionalOnClass (MsgService. class)
@EnableConfigurationProperties (MsgProperties.class)
public class MsgAutoConfiguration {
/**
注入屬性配置類
@Resource
private MsgProperties msgProperties;
@Bean
@ConditionalOnMissingBean(MsgService.class)
@ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue =
"true")
public MsgService msgService() {
MsgService msgService = new MsgService(msgProperties. getUr1(), msgPrope
rties.
msgProperties . getAccessKeySecret());
/如果提供了其他 set 方法, 在此也可以調用對應方法對其進行相應的沒置或初始化
return msgService;
}
}MsgAutoConfiguration 類 上 的 注 解 , @Configuration 用 來 聲 明 該 類 為 一 個 配 置類;@ConditionalOnClass 注解表示只有當 MsgService 類存在于 classpath 中,該類才會進行相應的實例化; @
EnableConfigurationProperties 會將 application.properties 中對應的屬性配置設置于 MsgProperties 對象中。

MsgAutoConfiguration 的 msgService 方法上的注解,@Bean 表明該方法實例化的對象會被加載到容器中; @ConditionalOnMissingBean 表示當容 器中不存在 MsgService 的對象時,才會進行實例化操作;
@ConditionalOnProperty 表示當配置文件中 msg.enabled=true 時才進行相應的實例化操作,默認情況下不會進行實例化操作。
基本功能已經(jīng)完成,我們只需要將 MsgAutoConfiguration 類進行自動配置注冊即可。在前面的章節(jié)中我們已經(jīng)了解到,凡是 classpath' 下 jar 包中 META-INF/spring.factories 中的配置 ,在 Spring Boot 啟動時都會進行相應的掃描加載。因此,我們無須直接修改 SpringBoot 的 spring.factories 文件, 只需在新建的 starter 項目中添加對應目錄和文件即可。
在當前項目的 resources 目錄下創(chuàng)建 META-INF/spring.factories 文件,并對自動配置類進行注冊。如果有多個自動配置類,用逗號分隔換行即可。
org. springframework . boot . autoconfigure . EnableAutoConfiguration=\com. secbro2 .
msg. MsgAutoConfiguration至此,一個基于Spring Boot 的自動配置 starter 便完成了。使用 maven 將其打包到本地倉庫或上傳至私服,其他項目便可以通過 maven 依賴進行使用。

本文給大家講解的內(nèi)容是創(chuàng)建SpringBoot自動配置項目:自定義Spring BootStarter項目
1.下篇文章給大家講解的是創(chuàng)建SpringBoot自動配置項目:Starter測試使用;
2.覺得文章不錯的朋友可以轉發(fā)此文關注小編;
3.感謝大家的支持!
本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學習更多的話可以到微信公眾號里找我,我等你哦。
