在代理類中引用動態代理

在Stackoverflow中有一個有趣的問題 ,關于Spring Bean如何獲??得對由Spring創建的代理的引用以處理事務,Spring AOP,緩存,異步流等。需要對代理的引用,因為如果存在對自身的調用通過代理bean,此調用將完全繞過代理。

考慮一個InventoryService接口:

public interface InventoryService{public Inventory create(Inventory inventory);public List<Inventory> list();public Inventory findByVin(String vin);public Inventory update(Inventory inventory);public boolean delete(Long id);public Inventory compositeUpdateService(String vin, String newMake);
}

還請考慮該服務的默認實現,并假設最后一個方法CompositeUpdateService內部在Bean本身上調用兩個方法,如下所示:

public Inventory compositeUpdateService(String vin, String newMake) {logger.info("composite Update Service called");Inventory inventory = this.findByVin(vin);inventory.setMake(newMake);this.update(inventory);return inventory;
}

如果我現在創建一個方面來建議對InventoryService的任何調用,以跟蹤每個方法調用花費的時間,Spring AOP將為InventoryService bean創建一個動態代理:

但是,對CompositeUpdateService的調用將僅在此方法的級別上記錄時間,即CompositeUpdateService內部對findByVin的調用,update繞過了代理,因此不會被跟蹤:

一個好的解決方法是使用AspectJ的全部功能– AspectJ會更改DefaultInventoryService的所有方法的字節碼,以包括對建議的調用。

我們制定的解決方法是將對代理本身的引用注入到bean中,而不是調用this.findByVin和this.update,而是調用proxy.findByVin和proxy.update!

因此,現在我們如何將對代理的引用干凈地注入到bean中-我提供的解決方案是創建一個接口,以標記對自己的代理感興趣的bean:

public interface ProxyAware<T> {void setProxy(T proxy);
}

感興趣的接口及其實現如下所示:

public interface InventoryService extends ProxyAware<InventoryService>{
...
}public class DefaultInventoryService implements InventoryService{ ...private InventoryService proxy;@Overridepublic void setProxy(InventoryService proxy) {this.proxy = proxy;}
}

然后定義一個BeanPostProcessor注入這個代理!

public class ProxyInjectingBeanPostProcessor implements BeanPostProcessor, Ordered {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (AopUtils.isAopProxy((bean))){try {Object target = ((Advised)bean).getTargetSource().getTarget();if (target instanceof ProxyAware){((ProxyAware) target).setProxy(bean);}} catch (Exception e) {return bean;}}return bean;}@Overridepublic int getOrder() {return Integer.MAX_VALUE;}
}

不是最干凈的實現,但是可以!

參考: http : //blog.springsource.org/2012/05/23/understanding-proxy-usage-in-spring/

參考: all和雜項博客中, JCG合作伙伴 Biju Kunjummen 引用了代理課程中的動態代理 。


翻譯自: https://www.javacodegeeks.com/2012/07/reference-to-dynamic-proxy-in-proxied.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Array的用法總結-swift

Araay是有序的數據集&#xff0c;在OC中分為不可變數組NSArray和可變數組NSMutableArray&#xff0c;在swift中只有常量和變量兩種類型&#xff0c;聲明成變量那就可以說明是可變的了&#xff01; 學習時的具體的用法總結成如下的代碼&#xff1a; //數組var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 轉載于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,淺談Linux 網絡 I/O 模型簡介(圖文)

1、介紹Linux 的內核將所有外部設備都看做一個文件來操作(一切皆文件)&#xff0c;對一個文件的讀寫操作會調用內核提供的系統命令&#xff0c;返回一個file descriptor(fd&#xff0c;文件描述符)。而對一個socket的讀寫也會有響應的描述符&#xff0c;稱為socket fd(socket文…

handsontable 方法匯總

核心方法1.為handsontable添加鉤子方法 addHook(key,callback):key為鉤子方法名 例如&#xff1a;hot.addHook(beforeInit, myCallback); addHookOnce(key,callback)&#xff1a;添加只使用一次的方法&#xff0c;用完后自動刪除 例如&#xff1a;hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("張三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地圖透明黑字,Android 仿高德地圖可拉伸的BottomSheet

原標題&#xff1a;Android 仿高德地圖可拉伸的BottomSheet2018安卓巴士開發者大會-上海站你一直期待的安卓技術盛宴即將登場&#xff01;前言最近項目中需要用到高德地圖搜索結果后的結果展示的可拉伸控件。而我看到這個效果圖&#xff0c;覺得這個就是一個slidingpanel&#…

Java EE 7中包含哪些JSR?

我開始填寫所有應該加入Java EE 7的Java規范請求的表。 由于平臺版本仍在確定中&#xff0c;因此某些細節很難確定。 完整的Java EE 7 EJB產品具有以下標準組件和API&#xff1a; 名稱 版 描述 JSR 網頁 輪廓 批處理 1.0 批量處理 352 Bean驗證 1.1 Bean驗證框…

[ Javascript ] JavaScript中的定時器(Timer) 是怎樣工作的!

作為入門者來說。了解JavaScript中timer的工作方式是非常重要的。通常它們的表現行為并非那么地直觀&#xff0c;而這是由于它們都處在一個單一線程中。讓我們先來看一看三個用來創建以及操作timer的函數。var id setTimeout(fn, delay); - 初始化一個單一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

釋放雙眼&#xff0c;帶上耳機&#xff0c;聽聽看~&#xff01;在Android開發中&#xff0c;當程序發生異常時會拋出異常信息&#xff0c;先說下三種常見類型&#xff1a;列表內容KeyDispatchTimeout(谷歌default 5s&#xff0c;MTK平臺上是8s) –主要類型按鍵或觸摸事件在特定…

修改httpd默認端口號

Tomcat: vim /etc/httpd/conf/httpd.conf//別忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 轉載于:https://www.cnblogs.com/bincoding/p/6067054.html

整合彈簧,速度和瓷磚

我喜歡 Tiles&#xff0c; 并且聽到了很多有關 Velocity的信息 。 它們似乎有不同的用途&#xff0c;并且據說很容易結合在一起&#xff0c;所以我決定試一試&#xff0c;并在Spring Web應用程序中同時使用它們。 集成實際上花費了許多小時&#xff0c;并且是一次真正的過山車&…

Android 軟鍵盤自動彈出和關閉

在我們寫修改信息或者搜索&#xff0c;修改密碼等界面的時候&#xff0c;用戶進入這個界面的主要目的就是輸入修改/查找 某些信息&#xff0c;為了用戶體驗應該自動彈出軟鍵盤而不是讓用戶主動點擊輸入框才彈出。 1.軟鍵盤的自動彈出 private void showKeyboard(){InputMethodM…

android adb殺死服務,Android app是如何殺掉的

1. adb shell kill -9 pid_of_appAMS定義了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里會注冊 App 進程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);當App進…

iOS學習筆記39-ReactiveCocoa入門

FRP&#xff0c;全稱為Functional Reactive Programming&#xff0c;是一種響應變化的編程范式&#xff0c;最近幾年比較火&#xff0c;大概的理解就像這樣&#xff1a; 當a的值或者b的值發生變化時&#xff0c;c的值會自動響應a的值或b的值變化的信號&#xff0c;自動更正自己…

使用密碼摘要生成器擴展JMeter

最近&#xff0c;我不得不處理一個帶有50,000條用戶記錄的OpenLDAP實例&#xff0c;并進行一些壓力測試。 JMeter是填充LDAP的最佳選擇。 但是&#xff0c;在我的情況下&#xff0c;OpenLDAP配置為不接受任何明文密碼。 因此&#xff0c;我無法使用通過JMeter LDAP Request采…

制造業數字化轉型核心不止是技術

一、制造業的數字化轉型意味著什么&#xff1f; 在當今的制造業領域&#xff0c;數字化轉型意味著通過集成數字技術來增強傳統的制造方法、產品和勞動力的過程。這些技術包括一系列創新&#xff0c;如自動化軟件、電子商務系統、傳感器、工業機器人等。 二、制造業數字化轉型的…

分類測試以減少構建時間

在繼續本文的主要內容之前&#xff0c;讓我們先進行一些定義。 單元測試 單元測試是小型的&#xff08;測試一種用例或單元&#xff09;&#xff0c;在內存中運行&#xff08;不與數據庫&#xff0c;消息隊列等交互&#xff09;&#xff0c;可重復且快速的測試。 對于我們的對…

android橫向展示狀態,【報Bug】Android橫屏狀態下啟動App,即使在App.vue中鎖定豎屏,但是首頁nvue中的rpx單位是按照啟動的橫豎屏狀態顯示的!...

詳細問題描述(DCloud產品不會有明顯的bug&#xff0c;所以你遇到的問題大都是在特定環境下才能重現的問題&#xff0c;請仔細描述你的環境和重現方式&#xff0c;否則DCloud很難排查解決你的問題)[內容]重現步驟[步驟][結果][期望]nvue首頁rpx單位能夠根據App.vue鎖定的屏幕方向…

property修飾關鍵字

修飾符按作用區分&#xff1a;線程安全相關&#xff0c;內存相關&#xff0c;讀寫權限相關&#xff0c;set和get,是否可為空, class 一.默認值 property NSArray *dataArray; 默認的是&#xff1a;atomic&#xff0c;strong&#xff08;有的文章寫的居然是assign,我認為還是str…

高精度相關模板.

1 2 /*3 高精度加法.4 */5 #include<cstring>6 #include<cstdio>7 #include<iostream>8 #define MAXN 100019 using namespace std;10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;11 char m[MAXN],n[MAXN];12 void slove()13 {14 l3max(l1,l2);15 for(in…