# spring-boot-annotation-lock-starter **Repository Path**: caiwantai/spring-boot-annotation-lock-starter ## Basic Information - **Project Name**: spring-boot-annotation-lock-starter - **Description**: 基于AbstractBeanFactoryAwareAdvisingPostProcessor 实现的一个简单的注解切面锁。springboot starter - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-11-11 - **Last Updated**: 2024-04-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-boot-annotation-lock-starter ## 介绍 基于`AbstractBeanFactoryAwareAdvisingPostProcessor` 实现的一个简单的注解切面锁 ## 使用说明 ### 1. 继承抽象类 `LockAnnotationInterceptor.java` 实现切面锁逻辑 可查看 `MethodAnnotationInvocation` 获取更多信息 ```java public class DefaultLockAnnotationInterceptor extends LockAnnotationInterceptor { public DefaultLockAnnotationInterceptor(Set> annotationClass) { super(annotationClass); } @Override protected Object invokeMethod(MethodAnnotationInvocation invocation) throws Throwable { // invocation.getAnnotationAttributes() 获取 注解 信息 AnnotationAttributes annotationAttributes = invocation.getAnnotationAttributes(); // 获取注解的 锁key 生成策略 KeyInfo keyInfo = invocation.getKeyInfo(); System.out.println(keyInfo); TaiLock lock = new TaiLock(); lock.lock(keyInfo.getKey()); try { System.out.println("before " + invocation); System.out.println(Arrays.toString(invocation.getArgs())); System.out.println(annotationAttributes); // 执行真实方法获取下一个 Advice Object result = invocation.proceed(); System.out.println("after " + invocation); return result; } finally { lock.lock(keyInfo.getKey()); } } } ``` ### 2. 启动配置 ```properties # 是否开启这个自动配置 tai.lock.aspect.config.enabled=true # 定义自己的锁切面逻辑 tai.lock.aspect.config.advice=org.tai.lockAspect.advice.impl.DefaultLockAnnotationInterceptor ``` ### 3. 实现 `KeyStrategy.java` 写锁 key 的生成 策略 可以查看 `KeyInfo` 可以定制自己锁 key 的信息。`KeyInfo` 不够用,里面有个自定义参数`Object`,您可以传入做定制。 ```java public class DefaultKeyStrategy implements KeyStrategy { private static final String SEPARATOR = ":"; public DefaultKeyStrategy() { } @Override public KeyInfo getKeyInfo(Object[] args) { String value = UUID.randomUUID().toString(); String key = value + SEPARATOR + Thread.currentThread().getId(); if (!ObjectUtils.isEmpty(args)) { key = key + SEPARATOR + System.identityHashCode(args); } return new KeyInfo("DefaultKeyStrategy:", key, value); } } ``` ### 4. 使用 `@LockAnnotation` 注解标注在类,或者方法上。 ```java @Service public class ServiceMethod { @LockAnnotation( keyStrategy = DefaultKeyStrategy.class) public void doSomething() { System.out.println("doSomething ServiceMethod"); } } ``` ```java // 类 所有方法都用 DefaultKeyStrategy 这个生成策略 @LockAnnotation( keyStrategy = DefaultKeyStrategy.class) @Service public class ServiceClass { public void doSomething() { System.out.println("doSomething ServiceClass"); } public void doSomething(String name) { System.out.println("doSomething ServiceClass" + name); } } ```