如何自制一个 Spring Boot Starter 并推送到远端公服

本贴最后更新于 2272 天前,其中的信息可能已经时异事殊

Profile


概 述

传统的 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

后记

由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    187 引用 • 318 回帖 • 255 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...