SpringBoot AOP切面实现对自定义注解的属性动态修改

文章讲述了如何在SpringBoot项目中,由于代码共用Redis且需区分dev和test环境,通过AOP切面解决@Cached注解的area属性动态配置问题。首先介绍使用AOP拦截注解方法并修改其属性值,然后讨论注解底层AOP执行顺序。然而,通过反射获取注解时可能遇到原始值的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

项目中共用了一个redis,而项目中部分代码使用了JetCache的@Cached注解。所以需要给@Cached动态配置area属性值,用来区分dev和test环境。

问题

自定义注解的属性值需要常量值,即static final修饰,直接通过配置文件不可行。

解决方案

1、使用AOP切面拦截使用注解的方法,动态修改注解的属性值。切面1。
2、注解的底层一般也有一个AOP切面。切面2。
需要确保切面1在切面2之前执行 (使用@order(int)注解,值越小越先执行)。

示例代码

yml配置文件:

testAop:
    actionValue: 测试-10101908-action

切面1:

@Component
@Aspect
@Slf4j
@Order(1)
public class MyAspect {

    @Value("${testAop.actionValue}")
    private String actionValue;

    @Before(value = "@annotation(webLogAnnotation)")
    public void aopTest(WebLogAnnotation webLogAnnotation) throws Throwable {
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(webLogAnnotation);
        Field value = invocationHandler.getClass().getDeclaredField( "memberValues");
        value.setAccessible(true);
        Map<String,Object> memberValues  = (Map<String,Object>) value.get(invocationHandler);
        memberValues.put("action", actionValue);
        log.info("MyAspect.aopTest memberValues:{}",memberValues);
    }
}

切面2:

@Component
@Aspect
@Order(2)
public class WebLogAspect{

    @Around("@annotation(webLogAnnotation)")
    public Object logAround(ProceedingJoinPoint joinPoint, WebLogAnnotation webLogAnnotation) throws Throwable {
        // do something......
}

controller:

@PostMapping("/getList")
@WebLogAnnotation(logType = "30010051",action = "通讯录-分页查询列表action",description = "'通讯录-分页查询列表desc'")
public PageResponseMsg<AddressBookVo>  getList(@RequestBody @Valid PageRequest<QueryAddressBookListReq> pageDto){
   // do something......
}

经测试,WebLogAspect中成功获取到MyAspect 中修改的注解参数值。如下所示:
在这里插入图片描述
遗留问题:

  • 必须传入该参数才可以获取到修改后的值
  • 通过反射方法method.getAnnotation(WebLogAnnotation.class)获取到的是原始值。若@Cached底层也是通过反射实现,则修改不了。

通过反射动态修改自定义注解属性值SpringBoot实现对自定义注解的切面自定义注解属性动态赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值