javascript
(Spring)静态/动态代理模式(AOP底层)
文章目錄
- 1.靜態代理
- 2.動態代理
1.靜態代理
靜態代理角色分析
-
抽象角色 : 一般使用接口或者抽象類來實現
-
真實角色 : 被代理的角色
-
代理角色 : 代理真實角色 ; 代理真實角色后 , 一般會做一些附屬的操作 .
-
客戶 : 使用代理角色來進行一些操作 .
代碼實現
Rent . java 即抽象角色
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
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底层)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Spring)使用注解开发
- 下一篇: (Spring)AOP-面向切面编程