如何自制一個Spring Boot Starter並推送到遠端公服


概 述

傳統的 Maven項目一般將需要被複用的組件做成 Module來進行管理,以便二次調用;而在 Spring Boot項目中我們則可以使用更加優雅的 Spring Boot Starter來完成這一切。
基於Spring Boot開發應用的過程可謂是幸福感滿滿,其開箱即用的特性分析已經在 《SpringBoot 應用程序啓動過程探祕》一文中詳細敘述過了。這個開箱即用的魔法特性很大程度上來源於各式各樣 Spring Boot Starter的加持,而且隨着版本的迭代 Starter家族成員日益龐大,而且各種優秀開源作者也提供了很多非常好用的Spring Boot Starter。

本文則嘗試自制一個Spring Boot Starter並推送到遠端倉庫進行管理。

注: 本文首發於 My Personal Blog:CodeSheep·程序羊,歡迎光臨 小站


新建項目

本文準備封裝一個簡單的 MD5摘要工具的 Starter,命名爲 md5test-spring-boot-starter,其本質就是一個 Maven項目,只不過我們需要完善pom文件的相關依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

編寫業務邏輯

首先提供一個 MD5Util工具類,負責實際的 MD5加密:

public class MD5Util {

    public static String getMD5( String source ) {
        return getMD5( source.getBytes() );
    }

    public static String getMD5(byte[] source) {
        String s = null;
        char hexDigits[] = { 
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte tmp[];
            synchronized ( MD5Util.class ) {
                md.update(source);
                tmp = md.digest(); 
            }
            char str[] = new char[16 * 2]; 
            int k = 0;
            for (int i = 0; i < 16; i++) { 
                byte byte0 = tmp[i]; 
                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
                str[k++] = hexDigits[byte0 & 0xf];
            }
            s = new String(str); 

        } catch (Exception e) {
            e.printStackTrace();
        }
        return s;
    }

}

再來提供一個 MD5Service類 進行一次封裝

public class MD5Service {
    public String getMD5( String input ) {
        return MD5Util.getMD5( input.getBytes() );
    }
}

編寫自動裝配類

這一步十分重要,也是編寫 Spring Boot Starter最重要的一步:

@Configuration
public class MD5AutoConfiguration {
    @Bean
    MD5Service md5Service() {
        return new MD5Service();
    }
}

當然此處可以說是最簡自動裝配類了,該部分其實還包含各種豐富的可控註解,可以 參考這裏


編寫spring.factories

我們還需要在 resources/META-INF/ 下創建一個名爲 spring.factories的文件,然後置入以下內容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.codesheep.auto.MD5AutoConfiguration

這一步也是相當重要哇,爲什麼這一步這麼重要呢,因爲我已經在文章《SpringBoot 應用程序啓動過程探祕》 中講過了,Spring Boot自動注入的奧祕就來源於 Spring Boot應用在啓動過程中會通過 SpringFactoriesLoader 加載所有 META-INF/spring.factories 文件,通過一系列的處理流程最終將 spring.factories 文件中的定義的各種 beans 裝載入 ApplicationContext容器。

這一步搞定之後其實一個 Spring Boot Starter已經寫好了,接下來可以通過 mvn:install打包,並傳到 私有/公有Maven倉庫以供使用了。


推送到遠端倉庫

很多公司都搭有私有的 Maven倉庫,但個人實驗可以藉助於 JitPack這個 “遠端公服”來爲我們託管自制的 Spring Boot Starter。

我們將編寫好的 Spring Boot Starter代碼置於 Github公有倉庫上,然後通過 JitPack來拉取我們的代碼並打包生成Jar包即可


使用Spring Boot Starter

新建一個測試工程來測試一下我們編寫的 md5test-spring-boot-starter。工程創建完畢後,在 pom.xml中加入如下兩個元素:

  • 添加 JitPack repository
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
  • 添加 md5test-spring-boot-starter依賴:
<dependency>
    <groupId>com.github.hansonwang99</groupId>
    <artifactId>md5test-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>

再編寫一個測試 Controller來測一下MD5摘要算法的功能:

@RestController
public class TestController {

    @Autowired
    private MD5Service md5Service;

    @RequestMapping("/test")
    public String getMD5() {
        return "MD5加密結果爲:" + md5Service.getMD5("mypassword");
    }
}

調用 /test接口後的加密結果爲:

MD5加密結果爲:34819D7BEEABB9260A5C854BC85B3E44

後記

由於能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章