AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

嚴重!Spring AOP Bug導致切面重復執行

來源: 責編: 時間:2024-06-11 17:52:52 198觀看
導讀環境:Spring6.1.71. 問題復現為了提高代碼的復用性和維護性,我們設計了一個通用的抽象的切面父類。這個父類封裝了通用的切面邏輯,如日志記錄、性能監控、異常處理等。通過繼承這個抽象父類,具體的業務切面可以輕松地擴展

環境:Spring6.1.71RG28資訊網——每日最新資訊28at.com

1. 問題復現

為了提高代碼的復用性和維護性,我們設計了一個通用的抽象的切面父類。這個父類封裝了通用的切面邏輯,如日志記錄、性能監控、異常處理等。通過繼承這個抽象父類,具體的業務切面可以輕松地擴展或定制這些通用功能,而無需從零開始編寫切面邏輯。如下示例:1RG28資訊網——每日最新資訊28at.com

public abstract class CommonAspect {  @Pointcut("execution(public * com.pack..*.*(..))")  private void commonPointcut() {}  @Before("bean(*Service)")  protected void beforeLog(JoinPoint jp) {    System.out.println("通用日志記錄...") ;  }  @Around("@annotation(monitor)")  protected Object monitorRun(ProceedingJoinPoint pjp, Monitor monitor) throws Throwable {    Object ret = null ;    // TODO    ret = pjp.proceed() ;    // TODO    return ret ;  }  // other}

具體切面子類

@Component@Aspectpublic class LogAspect extends CommonAspect {  @Override  public void beforeLog(JoinPoint jp) {    System.out.println("重寫日志記錄功能") ;  }}

當項目運行時出現詭異的問題,既然打印了2次日志信息。1RG28資訊網——每日最新資訊28at.com

// 測試代碼AnnotationConfigApplicationContext context = ... ;PersonService ps = context.getBean(PersonService.class) ;ps.queryById(1L) ;

執行結果

重寫日志記錄功能重寫日志記錄功能查詢Person對象

雖然執行了我們重寫的方法,但是日志確輸出了2遍。1RG28資訊網——每日最新資訊28at.com

通過debug分析

容器在啟動初始化解析@Aspect切面時,在獲取切面類中的所有方法時,會得到兩個方法(父類及子類重寫的)1RG28資訊網——每日最新資訊28at.com

圖片圖片1RG28資訊網——每日最新資訊28at.com

在這里的getAdvisorMethods方法返回了3個方法,其中2個是父類中的一個是子類重寫的方法1RG28資訊網——每日最新資訊28at.com

圖片圖片1RG28資訊網——每日最新資訊28at.com

那么接下來根據這2個方法就會生成對應的Advisor對象。1RG28資訊網——每日最新資訊28at.com

圖片圖片1RG28資訊網——每日最新資訊28at.com

這也就是為什么重復的原因了。Spring并沒有判斷我當前的這個通知是否是重寫父類的方法。1RG28資訊網——每日最新資訊28at.com

注:在Spring中@Aspect定義的切面最終都會轉換為Advisor對象,當代理類在執行時會遍歷所有符合添加的Advisor然后從中取出對應的Advice(MethodInterceptor)對象。1RG28資訊網——每日最新資訊28at.com

既然知道了問題出現的原因,接下來就進行解決該問題。1RG28資訊網——每日最新資訊28at.com

2. 解決問題

2.1 解決辦法1

我們可以在子類重寫的方法上再加上通知類型,將切入點設置的不匹配任何方法即可1RG28資訊網——每日最新資訊28at.com

@Before("execution(public * xxxooo())")@Overridepublic void beforeLog(JoinPoint jp) {  System.out.println("重寫日志記錄功能") ;}

在這里重寫的方法上,將切入點重新寫,該切入點不會匹配任何的方法,這樣修改以后再次執行1RG28資訊網——每日最新資訊28at.com

重寫日志記錄功能查詢Person對象

正常執行,沒有重復輸出日志。1RG28資訊網——每日最新資訊28at.com

2.2 解決辦法2

該方法需要將Spring版本升級到6.1.8,在該版本中解決了該問題。來看看在該版本中是如何解決的。1RG28資訊網——每日最新資訊28at.com

6.1.8版本

核心方法還是在上面debug是看到的getAdvisors方法中1RG28資訊網——每日最新資訊28at.com

public class ReflectiveAspectJAdvisorFactory {  public List<Advisor> getAdvisors(...) {    List<Advisor> advisors = new ArrayList<>();    for (Method method : getAdvisorMethods(aspectClass)) {      // 在這里加入了判斷(當前方法是否與當前切面中的方法相同)      // 當遍歷到這里的Method是父類中的方法時,這里的getMostSpecificMethod      // 方法就會判斷根據方法的名稱再從當前切面類中獲取方法(那當然就不同了)      if (method.equals(ClassUtils.getMostSpecificMethod(method, aspectClass))) {        Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 0, aspectName);        if (advisor != null) {          advisors.add(advisor);        }      }    }  }}

圖片圖片1RG28資訊網——每日最新資訊28at.com

在6.1.8版本中通過這種方式就排除了父類的方法。1RG28資訊網——每日最新資訊28at.com

其它版本

圖片圖片1RG28資訊網——每日最新資訊28at.com

低于6.1.8版本,都沒有相應的判斷。1RG28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-93092-0.html嚴重!Spring AOP Bug導致切面重復執行

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: PHP 服務實現性能剖析、跟蹤和可觀察性14444444444444】=102102102102102102102102102102102102102102102102實踐

下一篇: 多線程編程在 C# 中的基礎概念與實現

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機發布會上,除了兩款手機新品之外,Redmi還帶來了兩款TWS真無線藍牙耳機產品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 跑分安卓第一!Redmi K60至尊版8月發布!盧偉冰:目標年度性能之王

    8月5日消息,Redmi K60至尊版將于8月發布,在此前舉行的戰略發布會上,官方該機將搭載搭載天璣9200+處理器,安兔兔V10跑分超177萬分,是目前安卓陣營最高的分數
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 電博會與軟博會實現"線下+云端"的雙線融合

    在本次“電博會”與“軟博會”雙展會利好條件的加持下,既可以發揮展會拉動人流、信息流、資金流實現快速交互流動的作用,繼而推動區域經濟良性發展;又可以聚
Top