需求背景
自定义注解,定义注解属性,在使用注解时通过SpEL表达式给属性传值。
自定义注解
@Documented
@Target({})
@Retention()
public @interface ApiLog {
/**
* 数据编号
* @return
*/
String taskNo() default "";
/**
* API提供商
*/
String apiProvider() default "";
/**
* API功能
*/
String apiFunction() default "";
/**
* API调用场景
*/
String scene() default "";
/**
* API响应码
* 通过该名称获取响应code值,判断API是否响应成功
*/
String codeName() default "";
/**
* API响应码值
* API响应码值,一般填成功的码值
*/
String code() default "";
}
注解的属性随意,按照功能需求设计。
在注解时使用SpEL表达式
1.在SpEL表达式中引用方法的入参
@ApiLog(taskNo = "#str")
public String test1(String str){
return str;
}
2.在SpEL表达式中引用方法的pojo类型参数的属性
@ApiLog(taskNo = "#")
public void test(DailyPowerRequestDto requestDto){
}
3.在SpEL表达式中调用静态方法
@ApiLog(taskNo = "T().test1(#)")
public void test(DailyPowerRequestDto requestDto){
}
public static void test1(String str){
(str);
}
格式为:T(...).functionName(参数1,参数2.....),其中括号里填“被调用的方法所属类的包路径”,可不是当前使用这个注解的类的包路径,并且调用的方法必须是静态方法,否则会报“找不带该方法”异常.
4.在SpEL表达式中调用非静态方法
@ApiLog(taskNo = "new ().test2(#)")
public void test(DailyPowerRequestDto requestDto){
}
public void test2(String str){
(str);
}
注意,调用非静态方法,语法非常像new一个对象的写法,但不同的是不能直接“new 类名”,必须是“new 类的完整包路径+类名”(参考示例),即使是调用的方法就在当前类中,也要严格按照规定格式写,否则一定报错。
5.在SpEL表达式中引用枚举
枚举
@Getter
@AllArgsConstructor
public enum IsDeleteEnum {
/**
* 数据是否删除
*/
NO(0, "有效"),
YES(1, "已删除")
;
private Integer code;
private String desc;
}
SpEL表达式
@ApiLog(taskNo = "T().()")
public void doTask(DailyPowerRequestDto requestDto) {
}