# 通用组件
**Repository Path**: lancer2/general-components
## Basic Information
- **Project Name**: 通用组件
- **Description**: 一个简单实用的组件库,方便你的开发
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 38
- **Created**: 2023-07-28
- **Last Updated**: 2023-07-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 创建自己的spring boot starter
首先最重要的第一步就是如何创建自己的spring boot starter,这个很简单啊,直接用模板就行了
### 初始化组件包结构
创建一个spring boot项目,用https://start.spring.io/或者Idea创建都可以,删除启动类,把包精简成上面这个样子
### 创建spring.factories文件
resources包下手动创建一个META-INFO文件夹,并且在包下创建一个spring.factories文件,文件内容写,注意空格(使用Idea会有提示)
```
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cloud.tool.config.ToolAutoConfiguration
```
spring.factories的工作原理类似于Java原生的SPI机制,在此基础上进行了优化,可以一个文件写多个接口,想深入了解的可以搜一下@EnableAutoConfiguration这个注解的工作原理。
### 创建统一注册类
```
import org.springframework.context.annotation.ComponentScan;
//统一注册BEAN
@ComponentScan(basePackages = "com.cloud.tool")
public class ToolAutoConfiguration {
}
```
ToolAutoConfiguration这个类主要是方便做bean的注册,@ComponentScan这个注解会扫描并加载属性basePackages指定的包路径下所有bean,就不用在spring.factories文件逐个写了,只用写这个类就行了。@SpringBootApplication启动类注解也使用了@ComponentScan。
### pom文件配置
配置如下,着重关注下groupId和artifactId,这是组件在maven仓库里的坐标。finalname指定最终打包后的名称,install命令将包下载到本地,就是你在maven的setting.xml里配置的本地仓库,deploy命令会推送你的包到远程仓库(例如公司的私服)
```
4.0.0
com.cloud.tool
general-components
1.0.0
general-components
通用组件
UTF-8
UTF-8
1.8
1.8
org.springframework.boot
spring-boot-configuration-processor
true
2.3.12.RELEASE
org.springframework.boot
spring-boot-starter-aop
2.3.12.RELEASE
org.springframework.boot
spring-boot-starter-validation
2.3.12.RELEASE
org.springframework.boot
spring-boot-starter-web
2.3.12.RELEASE
org.projectlombok
lombok
1.18.22
provided
org.redisson
redisson
3.17.0
com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.4
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
toolbox
org.springframework.boot
spring-boot-maven-plugin
2.3.12.RELEASE
xxx
xxx
http://xxx
```
以上四步完成后就建立起了一个spring boot starter的架子,接下来就可以大展身手了(突然想到了一部番名:无职转生,到了异世界就拿出真本事,哈哈)
## 加密模块
加密用到了以下五个类,两个依赖和几项配置
JasyptField--提供注解JasyptField用于对象属性以及方法参数
JasyptMethod--提供注解JasyptMethod用于注解在方法上
JasyptHandler--由切面方式实现,使用时请务必注意切面使用禁忌
JasyptConstant--常量
JasyptMybatisHandler--mybatis处理扩展
```
com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.4
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
```
```
# 加密盐值,如果报空指针找不到该行,查看代码是否有config类
jasypt.encryptor.password=wzy
# 加密前缀及后缀默认ENC( ),例如密文SCM(s0kO6zE9NteZrzUbpzeCE9PinvI)
jasypt.encryptor.property.prefix=SCM(
jasypt.encryptor.property.suffix=)
# 加密算法设置3.0.0以后
jasypt.encryptor.algorithm=PBEWithMD5AndDES
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
```
加密工具类我没有自己写,原因是jasypt实在是太好用了,https://github.com/ulisesbocchio/jasypt-spring-boot 我用的spring boot版本的,里面readme比较详细,http://www.jasypt.org/原版官网,不过我觉得普通用用,看看博客就行了,上手更快。
加密的话,我一开始是只写了一种,切面JasyptHandler做接口出入参的加密解密,后来同事反馈说咱们用mybatis直接扩展不就行了,好家伙说得妙啊,mybatis果然有这样的扩展类TypeHandler,然后根据这个写了个JasyptMybatisHandler
### 切面加密
切面的切入点是@JasyptMethod,目前测试过的有String,obj,List,如有没支持的可以自行扩充。逻辑也很简单,获取入参后,根据类型判断,如果是对象的话,会去反射获取所有字段,判断字段上有没有注解@JasyptField,如果有的话,进行加密解密
### Mybatis扩展
这个是我们在项目里常用的,使用方式很简单,指定typeHandle为自定义的类就行了,基于mybatis提供的扩展窗口,对String类型的字段在填入和取出时分别进行加密和解密
使用时,如果是mybatis-plus,务必在表映射实体类上增加注解@TableName(autoResultMap = true)
使用时须在对应实体类字段上加 typeHandler = JasyptMybatisHandler.class
## Redis+Lua工具包
使用Lua脚本,原因:
1.减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。使用lua脚本执行以上操作时,比redis普通操作快80%左右
2.原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。
3.复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。
### redis单号生成器
单号按照keyPrefix+yyyyMMdd+4位流水号的格式生成
redis获取当前keyPrefix对应的key,如果没有则返回1,如果存在,判断是否大于9999,如果大于返回错误,如果小于就将value+1,并且设置过期时间直到今天结束。
### redis漏斗算法限流器
基于Lua+Aop,切点是@LimitMethod,注解参数是同时运行次数,使用场景是前后端的接口
@Around运行实际方法前进行限流(使用次数自增),@AfterRunning后返还使用次数
## 配置类
### BusinessBeanConfig
这个类用于帮助你排除bean用的,比如我就拿来排除掉公司框架里的全局异常监听
### MyRedissonConfig
Redisson的配置类,主要是启动参数的配置以及编码的配置,这里全局设置的String,用这个主要是因为想要保证Redis数据的可读性
### ThreadPoolConfig
线程池的配置,这里简单的进行了CPU型和IO型的配置,可以通过ToolProperties类在application配置类写简单参数,更具体的就自定义吧。这个线程池用的Spring包装后的ThreadPoolTaskExecutor,注意JDK原版的是ThreadPoolExecutor,Spring Boot项目的话,建议还是用包装后的
### ToolApplicationContextInitializer
启动时一次性运行类,我一般用来做配置文件校验。因为有的配置给不了默认值,只能强制让同事写,比如系统中文名
### ValidatorConfig
@Valid配置快速失败,类似于ArrayList的fail-fast机制,有错了就抛,不会校验后面的数据
## 美化Controller层
美化后效果,需要统一返回值并且配置全局异常监听
### 统一返回值
有一个类似于RemoteResult的类,包含状态码,消息,返回值,如果你有更多的内容需要输出那就扩展这个类
### 全局异常监听
简易版的会用到三个类
异常类ToolException,标准异常,错误码,错误信息。
抽象异常类AbstractException,这个类的主要作用是提供一个异常的架子,方便扩展,如果没啥需求,可以不用这个,只提供普通异常类就行
全局异常监听类ToolExceptionHandler,在这个类里面去监听不同的错误,根据不同的错误来进行对应的处理
感谢看到最后,分享下我的博客地址(里面有我的碎碎念,补充了markdown缺失的图片)
https://juejin.cn/post/7087875951010250759/
微信号:skyqiyunhun
如果想讨论问题,请注明 掘金+[问题类型]