1 背景

在平时的开发中,开发的同学会把一些通用的方法,写成一个工具类,例如日期转换的,JSON转换的等等,方便业务后续调用,使代码更容易维护。

如果一些更常用的方法,例如鉴权的,加解密的等等,几乎每个项目都会使用到,这时候开发的同学就会从以前的项目中再抄过来,随着项目的增多,几乎每个项目都有一份一模一样的工具类。经过技术评审决定,将这些工具类打包成jar包,后续的新项目可以直接以jar包的形式引入,重用就会变得非常的好。

由于项目本身是基于Spring Boot进行开发,jar包以Spring Boot Starter的方式发布似乎是不错的选择。

2 介绍

Spring Boot Starter 和普通jar包的区别在于,Spring Boot Starter 更加灵活,提供了自动装配的机制,以及可供用户配置等。下面以 加解密作为例子,手写一个 Spring Boot Starter ,从实战到原理去了解它的工作过程。

3 创建项目

创建一个Spring Boot 的项目,项目命名为digest-spring-boot-starter

spring官方的包命名为:spring-boot-starter-xxx

第三方包命名为:xxx-spring-boot-starter

pom.xml中引入依赖commons-codec(apache官方提供的加解密算法的工具包)

       <dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>

4 主体部分

加密逻辑书写,提供一个 Digest 接口,使用常用的 Md5Sha256摘要算法进行加密实现。

public interface Digest {

    /**
* 摘要算法
* @param raw 字符串
* @return 加密后的字符串
*/
String digest(String raw); }
public class Md5Digest implements Digest {
@Override
public String digest(String raw) {
System.out.println("使用MD5算法生成摘要");
return DigestUtils.md5Hex(raw);
}
}
public class Sha256Digest implements Digest {
@Override
public String digest(String raw) {
System.out.println("使用SHA256算法生成摘要");
return DigestUtils.sha256Hex(raw);
}
}

如果需要用户来指定使用哪种加密算法,需要在application.properties中添加一项配置:

digest.type=sha

创建一个配置类,拿到用户配置的type:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "digest")
public class Config { private String type; /**
* <bean id="md5Digest" class="com.xiaofengstu.digest.impl.Md5Digest"/>
* @return Digest
*/
@Bean
@ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "md5")
public Digest md5Digest() {
return new Md5Digest();
} @Bean
@ConditionalOnProperty(prefix = "digest", name = "type", havingValue = "sha")
public Digest sha256Digest() {
return new Sha256Digest();
}
}

日常开发中,比较常用的几个注解为:

@ConditionalOnBean:当容器中存在指定Bean的条件下

@ConditionalOnClass:当类路径匣有指定类的条件下

@ConditionalOnProperty:指定的属性是否有指定的值

5 配置自动装配

在 resources 目录下,创建一个文件夹名为 META-INF,创建一个文件名为spring.factories

这一步是固定写法

由于我们自己开发的starter是没有启动类的,所以需要告诉引用 starter 的项目,需要去加载哪些类。

spring.factories中填写:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xiaofengstu.digest.conf.Config

注释掉pom.xml中关于spring-boot-maven-plugin的部分,以至于后续执行 mvn package 操作得到是一个标准的jar包。

再执行mvn installstarter打包到本地仓库中。

6 使用starter

在需要的项目中引入刚刚打包好的starter

	<dependency>
<groupId>com.xiaofengstu</groupId>
<artifactId>digest-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

在代码中直接注入 Digest 即可:

@Resource
private Digest digest;

总结

  1. spring boot 2.7+ 的版本,spring.factorys写法稍有改动:

    文件内容,一行就是一个装配类:

  2. 如果没看明白的,可以参考一下 mybatis-plus-spring-boot-starter的写法

三分钟实战手写Spring Boot Starter的更多相关文章

  1. 自己写spring boot starter

    自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...

  2. 手把手教你手写一个最简单的 Spring Boot Starter

    欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...

  3. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  4. 年轻人的第一个自定义 Spring Boot Starter!

    陆陆续续,零零散散,栈长已经写了几十篇 Spring Boot 系列文章了,其中有介绍到 Spring Boot Starters 启动器,使用的.介绍的都是第三方的 Starters ,那如何开发一 ...

  5. 从零开始开发一个Spring Boot Starter

    一.Spring Boot Starter简介 Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件 ...

  6. 手写Spring MVC

    闲及无聊 又打开了CSDN开始看一看有什么先进的可以学习的相关帖子,这时看到了一位大神写的简历装X必备,手写Spring MVC. 我想这个东西还是有一点意思的 就拜读了一下大佬的博客 通读了一遍相关 ...

  7. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  8. 一个老程序员是如何手写Spring MVC的

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

  9. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  10. 我是这样手写 Spring 的(麻雀虽小五脏俱全)

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

随机推荐

  1. Kafka事务原理剖析

    一.事务概览 提起事务,我们第一印象可能就是ACID,需要满足原子性.一致性.事务隔离级别等概念,那kafka的事务能做到什么程度呢?我们首先看一下如何使用事务 Producer端代码如下 Kafka ...

  2. 大前端html基础学习02

    CSS核心属性 一.css属性和属性值的定义 属性:属性是指定选择符所具有的属性,它是css的核心. 属性值:属性值包括法定属性值及常见的数值加单位,如25px,或颜色值等. 二.CSS文本属性 1. ...

  3. 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」

    Linux系统:Centos 7 x64 Nginx版本:1.11.5 Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP) ...

  4. SpringCloud Alibaba(三) - GateWay网关

    1.基本环境搭建 1.1 依赖 <!-- Gatway 网关会和springMvc冲突,不能添加web依赖 --> <dependency> <groupId>or ...

  5. Android ViewPager2 + Fragment 联动

    Android ViewPager2 + Fragment 联动 本篇主要介绍一下 ViewPager2 + Fragment , 上篇中简单使用了ViewPager2 实现了一个图片的滑动效果, 那 ...

  6. Linux 中的文件简单说明

    Linux 中的文件简单说明 作者:Grey 原文地址: 博客园:Linux 中的文件简单说明 CSDN:Linux 中的文件简单说明 说明 本文基于 CentOS 7 根目录(/)下文件夹主要作用 ...

  7. 编译器优化丨Cache优化

    摘要:本文重点介绍几种通过优化Cache使用提高程序性能的方法. 本文分享自华为云社区<编译器优化那些事儿(7):Cache优化>,作者:毕昇小助手. 引言 软件开发人员往往期望计算机硬件 ...

  8. 【每日一题】【第一个出现的值】【二分】2022年1月10日-NC105 二分查找-II

    描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返 ...

  9. 【大数据面试】【框架】Linux命令、Shell工具、常见Shell脚本(群起脚本、数仓导入)

    一.Linux 1.常用高级命令 ps -ef:查看进程详情,ps -ef|grep dae可以搜索指定进程,-e表示环境变量 ps -au:以用户为主的详细格式,显示进程平均占用资源,不包括cmd列 ...

  10. 基于 Traefik 的激进 TLS 安全配置实践

    前言 Traefik是一个现代的HTTP反向代理和负载均衡器,使部署微服务变得容易. Traefik可以与现有的多种基础设施组件(Docker.Swarm模式.Kubernetes.Marathon. ...