1. 程式人生 > >如何自制一個Spring Boot Starter並推送到遠端公服

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

開發十年,就只剩下這套架構體系了! >>>   

傳統的 Maven專案一般將需要被複用的元件做成 Module來進行管理,以便二次呼叫;而在 Spring Boot專案中我們則可以使用更加優雅的 Spring Boot Starter來完成這一切。
基於Spring Boot開發應用的過程可謂是幸福感滿滿,其開箱即用的特性分析已經在 《SpringBoot 應用程式啟動過程探祕》

一文中詳細敘述過了。這個開箱即用的魔法特性很大程度上來源於各式各樣 Spring Boot Starter的加持,而且隨著版本的迭代 Starter家族成員日益龐大,而且各種優秀開源作者也提供了很多非常好用的Spring Boot Starter。

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

一、新建專案

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

	<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>


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

1、編寫業務邏輯

首先提供一個 MD5Util工具類,負責實際的 MD5加密:(這只是個案例,jdk8直接提供MD5加密,非常方便使用),放在 util 包下

package com.imddy.springboot.md5test.util;

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類 進行一次封裝:(都是為了案例寫的),放在 service 包下

package com.imddy.springboot.md5test.service;

import com.imddy.springboot.md5test.util.MD5Util;

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

2、編寫自動裝配類

這一步十分重要,也是編寫 Spring Boot Starter最重要的一步:(編寫專案springboot自動裝配類),放在 autoconfiguration 包下

package com.imddy.springboot.md5test.autoconfiguration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.imddy.springboot.md5test.service.MD5Service;

@Configuration
public class MD5AutoConfiguration {

	@Bean
    MD5Service md5Service() {
        return new MD5Service();
    }
	
}

這個是最簡單的例子,可以參考 官網 的說明。

3、編寫spring.factories

我們還需要在 resources/META-INF/ 下建立一個名為 spring.factories的檔案,然後置入以下內容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.imddy.springboot.md5test.autoconfiguration.MD5AutoConfiguration

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

這一步搞定之後其實一個 Spring Boot Starter已經寫好了。這裡還提供下pom.xml中的build

<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!-- 編譯原始碼版本和目標版本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- 資原始檔 utf-8編碼 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

接下來可以通過 mvn:install打包,並傳到 私有/公有Maven倉庫以供使用了。

 

二、新建測試專案

專案名稱為:md5testtest-spring-boot-starter 測試上面的spring-boot-starter

新增依賴:

        <dependency>
			<groupId>com.imddy.springboot</groupId>
			<artifactId>md5test-spring-boot-starter</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
        ......
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

引入了 springboot 的 web 依賴。

貼下pom.xml:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.imddy.springboot</groupId>
	<artifactId>md5testtest-spring-boot-starter</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>md5testtest-spring-boot-starter</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<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>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.imddy.springboot</groupId>
			<artifactId>md5test-spring-boot-starter</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!-- 編譯原始碼版本和目標版本 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- 資原始檔 utf-8編碼 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

編寫TestController (在 controller 包下):

package com.imddy.springboot.md5testtest.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.imddy.springboot.md5test.service.MD5Service;

@RestController
public class TestController {
	
	@Autowired
    private MD5Service md5Service;

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

編寫springboot的Application:

package com.imddy.springboot.md5testtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {

	public static void main(String[] args) throws Exception  {
		// TODO Auto-generated method stub
		SpringApplication.run(Application.class, args);
	}
}

執行結果如下:

三、他們把專案放到github中(國內支援gitee),通過https://jitpack.io實現直接在引入。

推送到遠端倉庫

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

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

預設github.com的,支援國內的gitee.com。
輸入 http://github.com/lenglingx/bbupdate ,或者直接lenglingx/bbupdate 。
這裡輸入的是hansonwang99/md5test-spring-boot-starter 。

輸入 http://gitee.com/lenglingx/bbupdate 或者 com.gitee.lenglingx/bbupdate 都可以。