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

需求背景

自定义注解,定义注解属性,在使用注解时通过SpEL表达式给属性传值。

自定义注解

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
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 = "#requestDto.orderNo")
public void test(DailyPowerRequestDto requestDto){

}

3.在SpEL表达式中调用静态方法

@ApiLog(taskNo = "T(com.dycjr.xiakuan.order.service.impl.DailyPowerServiceImpl).test1(#requestDto.orderNo)")
public void test(DailyPowerRequestDto requestDto){

}

public static void test1(String str){
    System.out.println(str);
}

格式为:T(com.xx.xxx.xxxx...).functionName(参数1,参数2.....),其中括号里填“被调用的方法所属类的包路径”,可不是当前使用这个注解的类的包路径,并且调用的方法必须是静态方法,否则会报“找不带该方法”异常.

4.在SpEL表达式中调用非静态方法

    @ApiLog(taskNo = "new com.dycjr.xiakuan.order.service.impl.DailyPowerServiceImpl().test2(#requestDto.orderNo)")
    public void test(DailyPowerRequestDto requestDto){

    }

    public void test2(String str){
        System.out.println(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(com.dycjr.xiakuan.order.enums.IsDeleteEnum).NO.getCode()")
public void doTask(DailyPowerRequestDto requestDto) {

}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
注解和SpEL(Spring表达式语言)可以结合使用来实现动态调用方法。 首先,在需要进行动态调用方法上添加注解,比如`@MyAnnotation`。 然后,在注解中定义一个属性,比如`value`,用来保存需要调用方法名,如`"doSomething"`。 接着,在调用方法的地方,使用SpEL表达式来获取注解中的属性值,并通过反射调用对应的方法。 下面是一个示例代码: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } @Service public class MyService { @MyAnnotation("doSomething") public void doSomething() { // do something } } @Service public class CallerService { @Autowired private ApplicationContext context; public void call(String methodName) { MyService service = context.getBean(MyService.class); Method method = ReflectionUtils.findMethod(MyService.class, methodName); ReflectionUtils.invokeMethod(method, service); } } // 调用 callerService.call("#root.targetMethod.value"); ``` 在上面的代码中,`MyAnnotation`注解中定义了一个`value`属性,用来保存需要调用方法名。`MyService`中的`doSomething`方法上添加了`@MyAnnotation("doSomething")`注解。 在`CallerService`中,通过`ApplicationContext`获取`MyService`实例,并通过反射调用对应的方法。在调用方法时,使用SpEL表达式`#root.targetMethod.value`来获取注解中的`value`属性值,从而实现动态调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值