從動態代理角度簡單理解Spring AOP

1. 概述

動態代理 是指在運行時,動態地創建目標類的代理對象,并對其中特定的方法進行攔截或增強的技術。這種技術主要用于在不修改目標類代碼的情況下,增強目標類的功能。?
在Java中,動態代理主要基于Java的反射機制和接口來實現。當一個類實現了某個接口,并且需要在不修改這個類代碼的前提下增加一些新的方法或者對原有方法進行一些處理(比如添加日志、事務管理、權限校驗等),就可以使用動態代理來實現。即它可以無侵入式的修改代碼

2. 講故事

為了方便理解,我這里舉一個生活中的故事吧,前不久報名了微軟云的認證考試,報名之后前往考點,我才發現這個考點其實根本就不是微軟公司親自設立的,而是有其他公司代理的,因為微軟雖大,但是不可能在世界每一個城市都親自設立辦公處或者說是認證考點吧。這種情況下微軟就需要請其他公司代理。幫他管理考試過程。那么微軟和代理公司在這個過程中分別做了什么呢?
首先是代理公司:

  • 代理公司需要提供考點
  • 當考生到了考點后,大代理公司的工作人員,需要對參考的考生進行檢查確認考生沒有夾帶或使用作弊工具
  • 代理公司需要查詢考生證件,確包是考生本人,而不是代考
  • 代理公司需要對考生全身照和寸照,用于給微軟公司證明考生無夾帶,以及將寸照傳入電子證書上。
  • 代理公司需要提供考試電腦,并幫助考試宣講考試步驟,考試過程攝像。教考試如何遠程獲取使用微軟考題。
  • 代理公司維持考場秩序
  • 如果考生考過了,代理公司需要打印微軟發送的證書,發給考生。

而微軟做了什么呢:

  • 管理考生報名
  • 網上收取考生考試費用
  • 考試時遠程提供題庫
  • 遠程發送證書

通過上面我們可以看到,代理給微軟節省了很多成本,也省了很多事,而代理公司通過這個過程也可以做一個兼職賺了一筆外快。是一個雙贏的局面。生活中這樣的例子有很多。
所以我們程序里面的動態代理,可以有很多類似的效果,為我們程序員減少重復代碼,提高擴展性等都很有用處。

3.動態代理的實現步驟如下:

  1. 定義接口:首先定義一個接口,這個接口定義了目標類需要實現的方法。
    package com.mycompany.proxyreflection2;public interface ExamServer {String examAz900();String examAz700();
    }
    

  2. 實現目標類:創建一個類實現上述接口,這個類就是目標類。
    package com.mycompany.proxyreflection2;public class TargetCompanyExamServerImpl implements ExamServer {@Overridepublic String examAz900() {return "This is microsoft, wlc exam azure 900, transfer the question bank to proxy";}@Overridepublic String examAz700() {return "This is microsoft, wlc exam azure 700, transfer the question bank to proxy";}
    }
    
  3. 創建InvocationHandler:創建一個實現了InvocationHandler接口的類,這個類將負責攔截并處理對目標類方法的調用。
    package com.mycompany.proxyreflection2;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;public class ProxyCompanyInvocationHandler implements InvocationHandler {private final Object target; // 目標對象 舉例中的微軟對象public ProxyCompanyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在調用目標方法之前執行一些操作(例如日志記錄)System.out.println("代理公司需要提供考點");System.out.println("當考生到了考點后,大代理公司的工作人員,需要對參考的考生進行檢查確認考生沒有夾帶或使用作弊工具");System.out.println("代理公司需要查詢考生證件,確包是考生本人,而不是代考");System.out.println("代理公司需要對考生全身照和寸照,用于給微軟公司證明考生無夾帶,以及、便將寸照傳入電子證書上。");System.out.println("代理公司需要提供考試電腦,并幫助考試宣講考試步驟,考試過程攝像。教考試如何遠程獲取使用微軟考題。");// 調用目標對象上的方法, 獲取微軟考題Object result = method.invoke(target, args);System.out.println(result);// 在調用目標方法之后執行一些操作(例如日志記錄)System.out.println("代理公司維持考場秩序");System.out.println("如果考生考過了,代理公司需要打印微軟發送的證書,發給考生。");return result;}
    }
    
  4. 創建代理對象:使用Proxy類的newProxyInstance方法,傳入目標類的類加載器、目標類實現的接口列表以及InvocationHandler實例,來創建代理對象。
    package com.mycompany.proxyreflection2;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;public class ProxyCompany {public static <T> T createProxy(T target) {// 獲取目標對象的類加載器和接口類型ClassLoader classLoader = target.getClass().getClassLoader();Class<?>[] interfaces = target.getClass().getInterfaces();// 創建一個 InvocationHandler 實例InvocationHandler handler = new ProxyCompanyInvocationHandler(target);// 使用 Proxy 類的靜態方法 newProxyInstance 創建代理對象T proxy = (T) Proxy.newProxyInstance(classLoader, interfaces, handler);return proxy;}
    }
    
  5. 調用方法:通過代理對象調用目標類的方法時,會首先被InvocationHandler的invoke方法攔截,可以在這個方法中添加額外的處理邏輯,然后再調用目標類的方法。
    package com.mycompany.proxyreflection2;public class ExamApi {public static void main(String[] args) {// 創建一個 ExamServer 的實現類實例ExamServer myService = new TargetCompanyExamServerImpl();// 使用 ProxyFactory 創建一個 ExamServer 的代理實例ExamServer proxyService = ProxyCompany.createProxy(myService);// 調用代理實例上的方法System.out.println("-----------------Start proxy exam Az 700----------------");proxyService.examAz700();System.out.println("-----------------Start proxy exam Az 900----------------");proxyService.examAz900();}
    }
    

    運行結果:

-----------------Start proxy exam Az 700----------------
代理公司需要提供考點
當考生到了考點后,大代理公司的工作人員,需要對參考的考生進行檢查確認考生沒有夾帶或使用作弊工具
代理公司需要查詢考生證件,確包是考生本人,而不是代考
代理公司需要對考生全身照和寸照,用于給微軟公司證明考生無夾帶,以及、便將寸照傳入電子證書上。
代理公司需要提供考試電腦,并幫助考試宣講考試步驟,考試過程攝像。教考試如何遠程獲取使用微軟考題。
This is microsoft, wlc exam azure 700, transfer the question bank to proxy
代理公司維持考場秩序
如果考生考過了,代理公司需要打印微軟發送的證書,發給考生。
-----------------Start proxy exam Az 900----------------
代理公司需要提供考點
當考生到了考點后,大代理公司的工作人員,需要對參考的考生進行檢查確認考生沒有夾帶或使用作弊工具
代理公司需要查詢考生證件,確包是考生本人,而不是代考
代理公司需要對考生全身照和寸照,用于給微軟公司證明考生無夾帶,以及、便將寸照傳入電子證書上。
代理公司需要提供考試電腦,并幫助考試宣講考試步驟,考試過程攝像。教考試如何遠程獲取使用微軟考題。
This is microsoft, wlc exam azure 900, transfer the question bank to proxy
代理公司維持考場秩序
如果考生考過了,代理公司需要打印微軟發送的證書,發給考生。?

這種方式的優點是可以在不修改目標類代碼的情況下增加新的功能,提高了系統的靈活性和可擴展性。但是,由于Java的動態代理是基于接口的,所以目標類必須實現一個或多個接口,否則無法使用動態代理。

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

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

相關文章

gdc2024:Raytracing in Snowdrop技術實現與性能優化策略

在今年的GDC&#xff08;游戲開發者大會&#xff09;的Advanced Graphics Summit上&#xff0c;關于Snowdrop引擎中光線追蹤技術的討論引起了廣泛關注。 一、光線追蹤全局照明的實現細節 屏幕空間追蹤&#xff1a; 屏幕空間追蹤從相機出發&#xff0c;對屏幕上的每個像素點生成…

DDL—表—數據類型—字符串類型相關語法

&#xff08;1&#xff09;表格可視化 普通字符串 類型大小描述CHAR0~255 bytes定長字符串&#xff0c;其表示即使你存儲一個字符&#xff0c;它也會占用你括號里個數的字符的空間&#xff0c;因為未占用的字符的其它空間會用空格進行補位。需要再后面跟一個參數&#xff1a;…

harmony 鴻蒙ArkUI動畫/交互事件開發常見問題(ArkTS)

ArkUI動畫/交互事件開發常見問題(ArkTS) 焦點事件onBlur/onFocus回調無法觸發(API 9) 問題現象 焦點事件onBlur/onFocus回調無法觸發 解決措施 焦點事件默認情況下需要外接鍵盤的Tab鍵&#xff0c;或方向鍵觸發&#xff0c;點擊觸發焦點事件需要添加焦點控制屬性focusOnTo…

Linux 監控USB硬盤插拔事件并自動掛載和卸載

定義udev規則來監控USB插拔事件。 一、在/etc/udev/rules.d目錄下隨意創建一個規則文件&#xff0c;例&#xff1a;99-usb-mount.rules KERNEL"sd[b-z]?",SUBSYSTEM"block",RUN"/usr/local/src/mountusb.sh %k $env{ACTION}"二、創建 /usr/lo…

基于arm64架構國產操作系統|Linux下的RTMP|RTSP低延時直播播放器開發探究

技術背景 2014年4月8日起&#xff0c;美國微軟公司停止了對Windows XP SP3操作系統提供服務支持&#xff0c;這引起了社會和廣大用戶的廣泛關注和對信息安全的擔憂。而2020年對Windows7服務支持的終止再一次推動了國產系統的發展。工信部對此表示&#xff0c;將繼續加大力度&a…

C++ 紅黑樹

目錄 1.紅黑樹的概念 2.紅黑樹的性質 3.紅黑樹節點的定義 4.紅黑樹的插入操作 5.數據測試 1.紅黑樹的概念 紅黑樹&#xff0c;是一種二叉搜索樹&#xff0c;但在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是Red或Black。 通過對任何一條從根到葉子的路徑上各個…

C++基礎與深度解析 | 泛型算法 | bind | Lambda表達式

文章目錄 一、泛型算法1.泛型算法的分類2.迭代器分類 二、bind與lambda表達式1.bind2.lambda表達式 三、泛型算法的改進--ranges(c20) 一、泛型算法 C中的泛型算法是標準模板庫&#xff08;STL&#xff09;的一部分&#xff08;這里重點討論 C 標準庫中定義的算法&#xff0c;而…

【vue-cli搭建vue項目的過程2.x】

vue-cli搭建vue項目 vue-cli搭建vue項目安裝node安裝vue-cli腳手架并創建項目安裝 Ant Design Vue或element-ui(筆者使用Ant-design-vue組件&#xff0c;并全局引入)開發安裝三方庫包1、Package.json文件---引入如下package.json文件執行npm i或npm install命令即可下載如下依賴…

數據結構~~鏈式二叉樹

目錄 一、基本概念 鏈式存儲概念 二、鏈式二叉樹的結構 鏈式二叉樹結構 構建鏈式二叉樹 二叉樹的遍歷 二叉樹節點和高度等 二叉樹銷毀 三、鏈式二叉樹的練習 相同的樹 對稱二叉樹 另外一顆子樹 二叉樹前序遍歷 二叉樹遍歷 四、完整代碼 Tree.h Tree.c 五、總結 一…

Linux服務升級:Predixy 升級代理 Redis-cluster 集群

目錄 一、實驗 1.環境 2. 啟動Redis服務 3.Predixy 升級代理 Redis-cluster 集群 二、問題 1. Predixy進行set操作報錯 2.如何創建腳本啟動predixy 3.Redis代理對比 一、實驗 1.環境 &#xff08;1&#xff09;主機 表1 主機 系統版本節點軟件IP備注CentOS7.9Redis…

Springboot開發 -- Postman 調試類型詳解

引言 在 Spring Boot 應用開發過程中&#xff0c;接口測試是必不可少的一環。Postman 作為一款強大的 API 開發和測試工具&#xff0c;可以幫助開發者輕松構建、測試和管理 HTTP 請求。本文將為大家介紹如何在 Spring Boot 開發中使用 Postman 進行接口測試。 一、準備工作 安…

C/C++|malloc分配內存詳解

看本節前&#xff0c;希望讀者有linux內存分布的基本概念&#xff0c;可以閱讀這篇文章&#xff1a; 進程虛擬地址空間和函數調用棧 在本節中希望讀者可以一口氣閱讀完所有內容。 本博客內容全部來自小林coding&#xff1a;malloc 是如何分配內存的&#xff1f; 這里僅為筆記記…

Python-圖片旋轉360,保存對應圖片

#Author &#xff1a;susocool #Creattime:2024/5/25 #FileName:turn360 #Description: 會旋轉指定的圖像文件360度&#xff0c;并將每個旋轉后的圖像保存到指定目錄&#xff0c;文件名以旋轉角度命名。 from PIL import Imagedef rotate_and_save(image_path, output_dir) :# …

Linux/Ubuntu 中安裝 ZeroTier,實現內網穿透,2分鐘搞定

相信很多人都有遠程連接家中設備的需求&#xff0c;如遠程連接家中的NAS、Windows等服務&#xff0c;所以會涉及到一個內網穿透工具的使用&#xff0c;如果沒有公網IP的情況下&#xff0c;推薦大家使用ZeroTier&#xff0c;這是一款強大的內網穿透工具。 mac和windows版的操作…

Nginx-狂神說

Nginx概述 公司產品出現瓶頸&#xff1f; 我們公司項目剛剛上線的時候&#xff0c;并發量小&#xff0c;用戶使用的少&#xff0c;所以在低并發的情況下&#xff0c;一個jar包啟動應用就夠了&#xff0c;然后內部tomcat返回內容給用戶。 但是慢慢的&#xff0c;使用我們平臺…

HTTP 各版本差異

http1.0 它的特點是每次請球和響應完畢后都會銷毀TCP 連接。同時規走前一個響應完成后才發送下一個請求。這樣做有兩個問題&#xff1a; 無法復用連接了。 每次請求都要創建新的TCP連接&#xff0c;完成三次握手和四次揮手。網絡利用率低 隊頭阻塞 如果前一個請求被某種原因阻…

K8S認證|CKA題庫+答案| 13. sidecar 代理容器日志

目錄 13、使用 sidecar 代理容器日志 CKA v1.29.0模擬系統免費下載試用&#xff1a; 題目&#xff1a; 開始操作&#xff1a; 1&#xff09;、切換集群 2&#xff09;、生成yaml文件 3&#xff09;、官網找模板 4&#xff09;、編輯yaml文件 5&#xff09;、應用yaml…

車載電子電器架構 —— 智能座艙技術

車載電子電器架構 —— 智能座艙技術 我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 屏蔽力是信息過載時代一個人的特殊競爭力&#xff0c;任何消耗你的…

qt multiple definition of 報錯解決

qt編譯報了很多錯&#xff0c; multiple definition of xxx 原來一維設計文件ui 的問題 后來發現是pro中頭文件和cpp文件重寫了&#xff0c;導致重復編譯報的錯 解決方法&#xff1a;把重復的頭文件和cpp文件刪了就可以了。

如何解決0.1+0.2!=0.3的問題

var x 0.1; var y 0.2; var z x y // z 的結果為 0.30000000000000004 if (z 0.3) // 返回 false 可以用整數的乘除法來解決 var z (x * 10 y * 10) / 10; // z 的結果為 0.3