如何自制一个 Spring Boot Starter 并推送到远端公服 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hansonwang99
V2EX    Blogger

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

  •  
  •   hansonwang99 2019-01-24 07:41:25 +08:00 2028 次点击
    这是一个创建于 2501 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Profile


    概 述

    传统的 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 文件的相关依赖:

    <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 

    后记

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



    1 条回复    2019-01-24 07:44:26 +08:00
    putaozhenhaochi
        1
    putaozhenhaochi  
       2019-01-24 07:44:26 +08:00 via Android
    推广节点
    /div> 关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2709 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 13:24 PVG 21:24 LAX 05:24 JFK 08:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86