com.ideaaedi.commonspring.lite.antidupli.AntiDuplication Maven / Gradle / Ivy
package com.ideaaedi.commonspring.lite.antidupli;
import org.springframework.expression.BeanResolver;
import org.springframework.expression.common.TemplateParserContext;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;
/**
* 防重复
*
*
* 子注解写法示例(子注解中可部分或全部重写@AntiDuplication中的属性):
* | @AntiDuplication
* | @Target(value = ElementType.METHOD)
* | @Retention(value = RetentionPolicy.RUNTIME)
* | public @interface MyAntiDuplication {
* | @AliasFor(annotation = AntiDuplication.class)
* | String spel() default "";
* |
* | @AliasFor(annotation = AntiDuplication.class)
* | long during() default 1L;
* |
* | @AliasFor(annotation = AntiDuplication.class)
* | TimeUnit unit() default TimeUnit.SECONDS;
* | }
*
*
* @author JustryDeng
* @since 2100.7.3
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.TYPE})
public @interface AntiDuplication {
/**
* 防重的相关spel (支持spel)
*
* spel表达式(注:因为本方法中用到了{@link TemplateParserContext}, 所以需要使用#{}将原生的spel包起来,形成最终的表达式)
* 1、获取属性示例:{@code #{#param1.fieldA} }
* 2、调用方法示例:{@code #{#param2.methodA()} }
* 3、调用spring-bean示例:{@code #{@userService.getUsername(#userId)}},
* 注:使用之前需要初始化bean解析器{@link com.ideaaedi.commonspring.parser.SpelUtil#initBeanResolver(BeanResolver)}
* 初始化bean解析器示例:{@code SpelUtil.initBeanResolver(new BeanFactoryResolver(applicationContext)); }
* 4、调用静态字段示例:{@code #{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE} }
* 注:若调用的是java.lang.包下的类,可以不指定包名
* 5、调用静态方法示例:{@code #{T(java.util.Objects).nonNull(#returnObj)} }
* 注:若调用的是java.lang.包下的类,可以不指定包名
* 6、枚举示例1:{@code {T(com.ideaaedi.demo.enums.CachePrefixEnum).USER_ACCOUNT_PHONE.name()} }
* 注:和调用静态方法是一样的
* 7、枚举示例2:{@code #{T(com.ideaaedi.demo.enums.CachePrefixEnum).USER_ACCOUNT_PHONE.key(#user.account, #user.phone)} }
* 注:和调用静态方法是一样的
* 8、判断示例1:{@code #{#code == 200} }
* 9、判断示例2:{@code #{#user == null} }
* 10、......
*
* 更多spel语法见{@link com.ideaaedi.commonspring.parser.SpelUtil}
*
*/
String spel() default "";
/**
* 时长
*/
long during() default 3L;
/**
* 时长单位
*/
TimeUnit unit() default TimeUnit.SECONDS;
/**
* 提示信息
*/
String message() default "";
}