日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring 嵌套方法AOP不生效问题

發布時間:2024/9/5 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 嵌套方法AOP不生效问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述, 如下Abc定義為一個Bean, b()方法添加@TargetDatasource,定義切面DynamicDataSourceAspect,期望:調用a()方法,b()方法上的AOP攔截能生效。實際不生效。

@Servicepublic class Abc {public void a(){
b();
}

@TargetDatasource(value=abc) public void b(){
} }

?

AOP代碼:

@Order(-1) @Component @Slf4j @Aspect public class DynamicDataSourceAspect {/*** set data source value.*/@Before(value = "@annotation(targetDataSource)", argNames = "targetDataSource")public void setDataSource(TargetDataSource targetDataSource) {if (targetDataSource != null && targetDataSource.value() != null) {log.info("Databse value: {}", targetDataSource.value());DynamicDataSourceHolder.set(targetDataSource.value());}}/*** clear data source value.*/@After(value = "@annotation(targetDataSource)", argNames = "targetDataSource")public void clearDataSource(TargetDataSource targetDataSource) {DynamicDataSourceHolder.clear();} }

?

問題分析:

我們都知道Spring aop有兩種實現方式,基于Interface生成代理和cglib生成代理。上面的例子中,當調用a()方法時,調用者拿到的是Abc的代理類,即增強類。如果a()方法上有@TargetDatasource注解,攔截會生效。然而,在a()方法里調用b(),b方法上的攔截不會生效。原因是因為a()調用b(), 用的是b()方法的目標類,而不是代理類,所以攔截不生效。

?

解決方法:

1. 重構代碼, 把b()方法移到一個Bean里面。

2. 調整a()方法如下:

@Servicepublic class Abc {public void a(){((Abc)AopContext.currentProxy()).b(); }@TargetDatasource(value=abc) public void b(){ } }

?

Sping 官方解釋 -?https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop?

轉載于:https://www.cnblogs.com/lzmrex/p/9450911.html

總結

以上是生活随笔為你收集整理的Spring 嵌套方法AOP不生效问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。