自定义注解,通过SpEL表达式调用类方法、引用方法参数、引用方法参数的属性

时间:2025-03-19 11:36:51

需求背景

自定义注解,定义注解属性,在使用注解时通过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) {

}

相关文章