Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
无难事者若执
Spring Utils
提交
f54c45c9
S
Spring Utils
项目概览
无难事者若执
/
Spring Utils
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Spring Utils
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
f54c45c9
编写于
8月 26, 2023
作者:
无难事者若执
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat : id生成框架 spring项目引入自动加载
上级
8d2752b7
变更
13
显示空白变更内容
内联
并排
Showing
13 changed file
with
303 addition
and
46 deletion
+303
-46
doc/通用id生成器领域/id.drawio
doc/通用id生成器领域/id.drawio
+2
-0
pom.xml
pom.xml
+12
-46
src/main/java/com/kx/config/IdAutoConfiguration.java
src/main/java/com/kx/config/IdAutoConfiguration.java
+11
-0
src/main/java/com/kx/utils/id/IdAlgorithmRegister.java
src/main/java/com/kx/utils/id/IdAlgorithmRegister.java
+86
-0
src/main/java/com/kx/utils/id/IdGenerator.java
src/main/java/com/kx/utils/id/IdGenerator.java
+20
-0
src/main/java/com/kx/utils/id/IdService.java
src/main/java/com/kx/utils/id/IdService.java
+40
-0
src/main/java/com/kx/utils/id/impl/LocalUuidGenerator.java
src/main/java/com/kx/utils/id/impl/LocalUuidGenerator.java
+25
-0
src/main/java/com/kx/utils/idempotent/annotation/Idempotent.java
...n/java/com/kx/utils/idempotent/annotation/Idempotent.java
+13
-0
src/main/java/com/kx/utils/idempotent/impl/AntiDuplicateTokenHandler.java
...m/kx/utils/idempotent/impl/AntiDuplicateTokenHandler.java
+28
-0
src/main/java/com/kx/utils/token/Token.java
src/main/java/com/kx/utils/token/Token.java
+36
-0
src/main/java/com/kx/utils/token/TokenGenerator.java
src/main/java/com/kx/utils/token/TokenGenerator.java
+10
-0
src/main/resources/META-INF/spring.factories
src/main/resources/META-INF/spring.factories
+4
-0
src/test/java/com/kx/test/IdTest.java
src/test/java/com/kx/test/IdTest.java
+16
-0
未找到文件。
doc/通用id生成器领域/id.drawio
0 → 100644
浏览文件 @
f54c45c9
<mxfile host="drawio-plugin" mdified="2023-08-26T06:35:13.778Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36" version="13.7.9" etag="KnpRbxr8W5eJYHEtHvRz" type="embed"><diagram id="1bsDMg0hRZ06JWtRajhb" name="Page-1"><mxGraphModel dx="510" dy="311" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="2" value="根据不同算法生成ID" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1"><mxGeometry x="140" y="240" width="120" height="60" as="geometry"/></mxCell><mxCell id="4" value="ID" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"><mxGeometry x="140" y="220" width="40" height="20" as="geometry"/></mxCell></root></mxGraphModel></diagram></mxfile>
\ No newline at end of file
pom.xml
浏览文件 @
f54c45c9
...
...
@@ -7,13 +7,20 @@
<groupId>
com.kongxiang
</groupId>
<artifactId>
kongxiang-spring
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<packaging>
jar
</packaging>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
2.3.11.RELEASE
</version>
<relativePath></relativePath>
</parent>
<properties>
<java.version>
1.8
</java.version>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
<spring-boot.version>
2.3.
7
.RELEASE
</spring-boot.version>
<spring-boot.version>
2.3.
11
.RELEASE
</spring-boot.version>
<spring-cloud-alibaba.version>
2.2.2.RELEASE
</spring-cloud-alibaba.version>
<spring-cloud.version>
Hoxton.SR9
</spring-cloud.version>
</properties>
...
...
@@ -41,38 +48,7 @@
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-dependencies
</artifactId>
<version>
${spring-cloud.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-dependencies
</artifactId>
<version>
${spring-boot.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-alibaba-dependencies
</artifactId>
<version>
${spring-cloud-alibaba.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-alibaba-dependencies
</artifactId>
<version>
${spring-cloud-alibaba.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
...
...
@@ -88,18 +64,8 @@
<!--<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<!– <mainClass>com.kx.raindrop.SpringCloudDddApplication</mainClass>–>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<version>2.3.11.RELEASE</version>
</plugin>-->
</plugins>
</build>
...
...
src/main/java/com/kx/config/IdAutoConfiguration.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.config
;
import
org.springframework.context.annotation.ComponentScan
;
/**
* @author kongxiang
*/
@ComponentScan
(
"com.kx.utils.id"
)
public
class
IdAutoConfiguration
{
}
src/main/java/com/kx/utils/id/IdAlgorithmRegister.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.id
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.DependsOn
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.StringUtils
;
import
javax.annotation.PostConstruct
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* id算法注册器
* @author kongxiang
*/
@Component
@Slf4j
public
class
IdAlgorithmRegister
{
/**
* 获取所有类型是 IdGenerator
*/
@Autowired
private
List
<?
extends
IdGenerator
>
idGeneratorList
;
protected
Map
<
String
,
IdGenerator
>
algorithmMap
=
new
ConcurrentHashMap
<>(
8
);
@PostConstruct
public
void
init
(){
if
(
idGeneratorList
!=
null
){
idGeneratorList
.
forEach
(
idGenerator
->
{
algorithmMap
.
put
(
idGenerator
.
getAlgorithm
(),
idGenerator
);
log
.
info
(
">> Load id generator successful -- : algorithm : [ {} ] "
,
idGenerator
.
getAlgorithm
());
});
}
}
/**
* 注册生成算法
* @param algorithm
* @param idGenerator
* @return 注册结果
*/
protected
boolean
register
(
String
algorithm
,
IdGenerator
idGenerator
){
boolean
registerStatus
=
false
;
if
(!
StringUtils
.
isEmpty
(
algorithm
)
&&
idGenerator
!=
null
){
algorithmMap
.
put
(
algorithm
,
idGenerator
);
registerStatus
=
true
;
}
return
registerStatus
;
}
/**
* 获取算法生成器类
* @param algorithm 算法
* @return 算法生成器
*/
public
IdGenerator
getAlgorithm
(
String
algorithm
){
IdGenerator
idGenerator
=
this
.
algorithmMap
.
get
(
algorithm
);
if
(
idGenerator
==
null
){
throw
new
UnsupportedOperationException
(
"id generate is not supported : "
+
algorithm
);
}
return
idGenerator
;
}
/**
* 是否存有算法生成器
* @param algorithm 算法
* @return
*/
protected
boolean
containAlgorithm
(
String
algorithm
){
return
this
.
algorithmMap
.
containsKey
(
algorithm
);
}
/**
* 列出所有支持的算法
* @return
*/
protected
Set
<
String
>
supportAlgorithms
(){
return
this
.
algorithmMap
.
keySet
();
}
}
src/main/java/com/kx/utils/id/IdGenerator.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.id
;
/**
* Id 生成器
*
* @author kongxiang
*/
public
interface
IdGenerator
{
/**
* 具体生成id的算法实现
* @return
*/
String
generate
();
/**
* 获取算法标识
* @return
*/
String
getAlgorithm
();
}
src/main/java/com/kx/utils/id/IdService.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.id
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.util.Set
;
/**
* id 相关能力
* @author kongxiang
*/
@Component
public
class
IdService
{
@Autowired
private
IdAlgorithmRegister
idAlgorithmRegister
;
/**
* 生成指定算法的id
* @param algorithm 算法
* @return id
*/
public
String
generate
(
String
algorithm
){
return
idAlgorithmRegister
.
getAlgorithm
(
algorithm
).
generate
();
}
/**
* 生成id 默认uuid算法
* @return id
*/
public
String
generate
(){
return
idAlgorithmRegister
.
getAlgorithm
(
"uuid"
).
generate
();
}
/**
* 显示支持的所有算法
* @return 支持的算法列表
*/
public
Set
<
String
>
supports
(){
return
idAlgorithmRegister
.
supportAlgorithms
();
}
}
src/main/java/com/kx/utils/id/impl/LocalUuidGenerator.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.id.impl
;
import
com.kx.utils.id.IdGenerator
;
import
org.springframework.stereotype.Component
;
import
java.util.UUID
;
/**
* 本地机器uuid id 生成器
* @author kongxiang
*/
@Component
public
class
LocalUuidGenerator
implements
IdGenerator
{
@Override
public
String
generate
()
{
return
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
}
@Override
public
String
getAlgorithm
()
{
return
"uuid"
;
}
}
src/main/java/com/kx/utils/idempotent/annotation/Idempotent.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.idempotent.annotation
;
/**
* 幂等注解
*
*/
public
@interface
Idempotent
{
String
value
()
default
""
;
}
src/main/java/com/kx/utils/idempotent/impl/AntiDuplicateTokenHandler.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.idempotent.impl
;
import
org.springframework.stereotype.Component
;
/**
* <pre>接口幂等性方案: 防重token令牌实现幂等性
* </pre>
*
* 针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。
* 简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中),后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,这样来保证幂等操作。
* <pre>
*
* 使用操作:
* 插入操作
* 更新操作
* 删除操作
* </pre>
*
* @author kongxiang
*/
@Component
public
class
AntiDuplicateTokenHandler
{
}
src/main/java/com/kx/utils/token/Token.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.token
;
import
lombok.Data
;
import
java.util.Date
;
/**
* Token 令牌
* 领域对象
* @author kongxiang
*/
@Data
public
class
Token
{
/**
* token 值
*/
private
String
value
;
/**
* token生成时间
*/
private
Date
createTime
;
/**
* token过期时间
*/
private
Long
expireMillSecond
;
/**
* 是否过期
* @return
*/
public
boolean
isExpire
(){
return
System
.
currentTimeMillis
()
-
expireMillSecond
>
createTime
.
getTime
();
}
}
src/main/java/com/kx/utils/token/TokenGenerator.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.utils.token
;
/**
* @author kongxiang
*/
public
interface
TokenGenerator
{
}
src/main/resources/META-INF/spring.factories
0 → 100644
浏览文件 @
f54c45c9
# Auto config
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.kx.config.IdAutoConfiguration
\ No newline at end of file
src/test/java/com/kx/test/IdTest.java
0 → 100644
浏览文件 @
f54c45c9
package
com.kx.test
;
import
org.junit.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
public
class
IdTest
{
@Test
public
void
IdGen
(){
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录