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

歡迎訪問 生活随笔!

生活随笔

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

javascript

(Spring)静态/动态代理模式(AOP底层)

發布時間:2025/3/20 javascript 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (Spring)静态/动态代理模式(AOP底层) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1.靜態代理
  • 2.動態代理

1.靜態代理

靜態代理角色分析

  • 抽象角色 : 一般使用接口或者抽象類來實現

  • 真實角色 : 被代理的角色

  • 代理角色 : 代理真實角色 ; 代理真實角色后 , 一般會做一些附屬的操作 .

  • 客戶 : 使用代理角色來進行一些操作 .

代碼實現
Rent . java 即抽象角色

//抽象角色:租房 public interface Rent {public void rent(); }

Host . java 即真實角色

//真實角色:房東 要出租房子 public class Host implements Rent{public void rent() {System.out.println("房屋出租");} }

Proxy . java 即代理角色

//代理角色:中介 public class Proxy implements Rent{private Host host;public Proxy() {}public Proxy(Host host) {this.host = host;}//租房public void rent() {seeHouse();host.rent();fare();}//看房public void seeHouse(){System.out.println("帶租客看房");}//收中介費public void fare(){System.out.println("收中介費");} }

Client . java 即客戶

//客戶類,一般客戶都會去找代理! public class Client {public static void main(String[] args) {//房東出租房屋Host host = new Host();//中介幫房東辦理相關事務Proxy proxy = new Proxy(host);//租客找中介租房proxy.rent();} }

在這個過程中,租戶直接接觸的就是中介,和房東沒有任何接觸,但卻依舊能夠租房子。
靜態代理的好處:

  • 可以使得我們的真實角色更加純粹 . 不再去關注一些公共的事情 .

  • 公共的業務由代理來完成 . 實現了業務的分工 ,

  • 公共業務發生擴展時變得更加集中和方便 .

缺點 :

  • 類多了 , 多了代理類 , 工作量變大了 . 開發效率降低 .

我們想要靜態代理的好處,又不想要靜態代理的缺點,所以 , 就有了動態代理 !
在公司開發,改變原有代碼是大忌,使用代理來做,能夠不改變原來的業務情況下,實現想要的功能。

在不改變原來的代碼的情況下,實現了對原有功能的增強,這是AOP中最核心的思想

2.動態代理

動態代理的角色和靜態代理的一樣 .

  • 動態代理的代理類是動態生成的 . 靜態代理的代理類是我們提前寫好的

  • 動態代理分為兩類 : 一類是基于接口動態代理 , 一類是基于類的動態代理

  • 基于接口的動態代理----JDK動態代理

  • 基于類的動態代理–cglib

JDK的動態代理需要了解兩個類

核心 : InvocationHandler 和 Proxy

【InvocationHandler:調用處理程序】

Object invoke(Object proxy, 方法 method, Object[] args)//參數 //proxy - 調用該方法的代理實例 //method -所述方法對應于調用代理實例上的接口方法的實例。方法對象的聲明類將是該方法聲明的接口,它可以是代理類繼承該方法的代理接口的超級接口。 //args -包含的方法調用傳遞代理實例的參數值的對象的陣列,或null如果接口方法沒有參數。原始類型的參數包含在適當的原始包裝器類的實例中,例如java.lang.Integer或java.lang.Boolean 。 //生成代理類 public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this); }

用動態代理實現租房

ProxyInvocationHandler. java 即代理角色

public class ProxyInvocationHandler implements InvocationHandler {private Rent rent;public void setRent(Rent rent) {this.rent = rent;}//生成代理類,重點是第二個參數,獲取要代理的抽象角色!之前都是一個角色,現在可以代理一類角色public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);}// proxy : 代理類 method : 代理類的調用處理程序的方法對象.// 處理代理實例上的方法調用并返回結果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {seeHouse();//核心:本質利用反射實現!Object result = method.invoke(rent, args);fare();return result;}//看房public void seeHouse(){System.out.println("帶房客看房");}//收中介費public void fare(){System.out.println("收中介費");} }

Client . java

public class Client {public static void main(String[] args) {//真實角色Host host = new Host();//代理實例的調用處理程序ProxyInvocationHandler pih = new ProxyInvocationHandler();pih.setRent(host);//將真實角色放進去Rent proxy = (Rent) pih.getProxy(); //動態生成對應的代理類!proxy.rent();} }

使用通用代理類實現增刪改業務
UserService.java

//抽象角色:增刪改查業務 public interface UserService {void add();void delete();void update();void query(); }

UserServiceImpl.java

//真實對象,完成增刪改查操作的人 public class UserServiceImpl implements UserService{public void add() {System.out.println("增加了一個用戶");}public void delete() {System.out.println("刪除了一個用戶");}public void update() {System.out.println("修改了一個用戶");}public void query() {System.out.println("查詢了一個用戶");} }

ProxyInvocationHandler.java

public class ProxyInvocationHandler implements InvocationHandler {private Object target;public ProxyInvocationHandler(Object target) {this.target = target;}//生成代理類,重點是第二個參數,獲取要代理的抽象角色!之前都是一個角色,現在可以代理一類角色public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);}// proxy : 代理類 method : 代理類的調用處理程序的方法對象.// 處理代理實例上的方法調用并返回結果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//反射獲取方法名log(method.getName());//核心:本質利用反射實現!Object result = method.invoke(target, args);return result;}public void log(String msg){System.out.println("實現了"+msg+"方法");}}

Client.java

public class Client {public static void main(String[] args) {//真實角色UserServiceImpl userService = new UserServiceImpl();//代理實例的調用處理程序ProxyInvocationHandler pih = new ProxyInvocationHandler(userService);UserService proxy = (UserService) pih.getProxy();proxy.add();} }


動態代理的好處

  • 靜態代理有的它都有,靜態代理沒有的,它也有!

  • 可以使得我們的真實角色更加純粹 . 不再去關注一些公共的事情 .

  • 公共的業務由代理來完成 . 實現了業務的分工 ,

  • 公共業務發生擴展時變得更加集中和方便 .

  • 一個動態代理 , 一般代理某一類業務

  • 一個動態代理可以代理多個類,代理的是接口!

總結

以上是生活随笔為你收集整理的(Spring)静态/动态代理模式(AOP底层)的全部內容,希望文章能夠幫你解決所遇到的問題。

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