Advisor 被重复代理问题排查

问题场景

项目中存在多个 AbstractAdvisorAutoProxyCreator 且其持有的 Advisor Bean 重复

问题复现

  • 相关代码
	@ResponseBody@RequiresPermissions(PermissionConstant.****)@GetMapping(value = "/query****.json", name = "")public List<***> query****() {return common*Service.query***().stream().distinct().collect(Collectors.toList());}@Override@Transactional // Transactional 是后来又添加的@Cacheable(cacheNames = "default", key="'**'")public List<***> query***() {// ...}

​ 其被 Shiro 注解RequiresPermissionsWebLogAspect#befareApiController 前置建议所拦截,并且其内部调用了使用 @Cacheable 的方法。

  • 重复代理堆栈截图以及重复带来的影响

在这里插入图片描述

AopAllianceAnnotationsAuthorizingMethodInterceptor(AuthorizingMethodInterceptor) 被重复执行会使,标注了org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor#AUTHZ_ANNOTATION_CLASSES 集合内的注解的Handler 重复鉴权。

在这里插入图片描述

TransactionInterceptor 被重复执行

在这里插入图片描述

CacheInterceptor 的重复执行 会是项目的缓存方法在未命中缓存的场景下缓存两次同样的内容。项目中目前使用 RedisCacheManager 则会发送两次命令。

  • 排查重复代理的思路

​ 项目中都是使用自动代理的方式使代理类生效。可以断点调试 AbstractAdvisorAutoProxyCreatorfindEligibleAdvisors 方法,并设置条件 beanName.equals("${beanName}") beanName:settlementController可以替换成其他的。可发现在创建 settlementController 的时候被代理了两次。 分别是 DefaultAdvisorAutoProxyCreatorAnnotationAwareAspectJAutoProxyCreator

在这里插入图片描述

解决重复代理

AnnotationAwareAspectJAutoProxyCreator 通过注解方式开启是通过 @EnableAspectJAutoProxy , 此类会添加一些Bean定义(beanDefinition)

DefaultAdvisorAutoProxyCreator 大部分框架中并未使用。可能是项目中 添加的工厂方法使其生效了

	@Beanpublic DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();// ...return creator;}

那么我们则可以利用 SpringBoot 的 @Conditional 相关注解标注工厂方法,例如当项目中存在了 AnnotationAwareAspectJAutoProxyCreator 我们就不用 DefaultAdvisorAutoProxyCreator

	@Bean@ConditionalOnMissingBean(AnnotationAwareAspectJAutoProxyCreator.class)public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator()...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576801.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新穗青少年开展“小小公民科学家”科考活动探索生物多样性

为帮助“新穗”青少年了解本土文化&#xff0c;提升个人知识面和动手能力&#xff0c;贯彻落实《未成年人保护法》《家庭教育促进法》《广东省生态环境教育条例》等有关文件精神&#xff0c;3月24日&#xff0c;天河区绿日同学公益服务促进会联合华南农业大学农潮工作室、广州城…

docker logs 查找日志常用命令

docker logs 是什么 docker logs 是 Docker 命令行工具提供的一个命令&#xff0c;用于查看容器的日志输出。它可以显示容器在运行过程中生成的标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;&#xff0c;帮助用户诊断容器的行为和排查…

阿里通义千问Qwen1.5开源MoE模型

介绍 2024年3月28日&#xff0c;阿里团队推出了Qwen系列的首个MoE模型&#xff0c;Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数&#xff0c;但其性能却能与当前最先进的70亿参数模型&#xff0c;如Mistral 7B和Qwen1.5-7B相媲美。相较于包含65亿个Non-Embedding参数的Qwen1.5-…

element-ui/view-ui表格的合并行和列的多种方法(超级详细)

vue的这两个组件库的表格的行和列的写法是一样的&#xff0c;都是通过span-method方法可以实现的&#xff1b;下面我们就以view ui的表格组件为例&#xff1b; 该方法参数为 4 个对象&#xff1a; row: 当前行column: 当前列rowIndex: 当前行索引columnIndex: 当前列索引 该…

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

神策数据参与制定首份 SDK 网络安全国家标准

国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff08;2023 年第 13 号&#xff09;&#xff0c;全国信息安全标准化技术委员会归口的 3 项国家标准正式发布。其中&#xff0c;首份 SDK 国家标准《信息安全技术 移动互联网应用程序&#xff0…

HCIE考试第二题:业务容器镜像制作

业务容器镜像制作做题目与题步骤如下 题目 解题步骤 业务容器镜像制作 2.1创建VPC 登录总部SC 创建一个VPC 网段环境有说,租户CCE子网就是 都保持默认,加个描述就好了 创建成功 2.2对等连接Peering 其实就是当前主机连http源那个资源服务器用的。 创建成功 【考试联系考官…

2024年2月游戏手柄线上电商(京东天猫淘宝)综合热销排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;游戏手柄品牌销售数据已出炉&#xff01;2月游戏手柄销售数据呈现出强劲的增长势头。 根据鲸参谋数据显示&#xff0c;今年2月游戏手柄月销售量累计约43万件&#xff0c;同比去年上涨了78%&#xff1b;销售额累计达1…

简单线程池的实现

线程池的代码可以写的很复杂&#xff0c;这里就稍微简单一些 首先来看一下线程池的原则&#xff0c;下面的大框是服务器&#xff0c;而在服务器中维护一个任务队列。 然后在server中预先创建一批线程&#xff0c;这批线程和任务队列合在一起只用向外界提供一个入队列的接口。 …

直流马达驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

[每日一氵] 将服务器的某个端口映射为另一台服务器的ssh连接地址

拓扑结构图&#xff0c;小火龙如何通过服务器A的某个端口ssh连接到服务器B呢? ssh连接准备 首先开启服务器B的ssh连接&#xff0c;若显示: ssh xxlocalhostssh: connect to host localhost port 22: Connection refused也许是ssh没安装 sudo apt-get install openssh-ser…

Linux应用实战之网络服务器(四)JavaScript介绍

0、前言 准备做一个Linux网络服务器应用实战&#xff0c;通过网页和运行在Linux下的服务器程序通信&#xff0c;这是第四篇&#xff0c;介绍一下JS&#xff0c;让HTML网页实现与服务器通信。 1、JS常用语法 JavaScript是一种脚本语言&#xff0c;主要用于前端开发&#xff0…