当前位置: 首页 > article >正文

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

文章目录

    • 需求
    • 问题
    • 解决方案
    • 示例代码

需求

项目中共用了一个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实现对自定义注解的切面、自定义注解属性动态赋值


http://www.kler.cn/news/163328.html

相关文章:

  • 无重复字符的最长子串(LeetCode 3)
  • 记录一下Mac配置SpringBoot开发环境
  • “华为杯”研究生数学建模竞赛2016年-【华为杯】A题:无人机在抢险救灾中的优化运用(附获奖论文及MATLAB代码实现)
  • perf与火焰图-性能分析工具
  • IntelliJ IDEA使用Eval Reset
  • Unity使用打成图集的Sprite作为模型贴图使用的问题
  • ubuntu server 20.04 备份和恢复 系统 LTS
  • 小红书用户采集工具:掌握策略,轻松吸引潜在客户
  • 【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter
  • 【链表Linked List】力扣-82 删除链表中的重复元素II
  • velocity-engine-core是什么?Velocity模板引擎的使用
  • pr抖音素材42个手机竖屏抖音视频转场特效PR剪辑模板
  • 浅谈5G基站节能及数字化管理解决方案的设计与应用-安科瑞 蒋静
  • 智慧城市是什么?为什么要建智慧城市?
  • 8_企业架构缓存中间件分布式memcached
  • 云原生系列1
  • 力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)
  • 卷积之后通道数为什么变了
  • java实现冒泡排序算法
  • 做题笔记:SQL Sever 方式做牛客SQL的题目--SQL156
  • 什么是Nginx反向代理?Nginx反向代理配置指南
  • Centos图形化界面封装OpenStack Centos镜像
  • Kubernetes(K8s)数据存储-09
  • c/c++中一些不常用但有用的知识
  • 【数据结构】插入排序,希尔排序,选择排序,堆排序,冒泡排序
  • 限流算法,基于go的gRPC 实现的
  • 阿里云磁盘在线扩容
  • 生信技能30 - 获取CNV开始位置和结束位置所在的染色体区带
  • L1-028:判断素数
  • JavaScript常用技巧专题一