Java靜態代理與動態代理 理解與應用場景


角色

  • 抽象角色:接口類
  • 實現角色: 實現類
  • 代理角色:代理實現的類,最終使用的對象

靜態代理

1. 接口

 1 /**
 2  * description
 3  *
 4  * @author 70KG
 5  * @date 2018/8/1
 6  */
 7 public interface IBusinessA {
 8 
 9     /**
10      * Description: 賣包的業務接口
11      * Author:70KG
12      * Param [brand] 品牌
13      * Return void
14      * Date 2018/8/1 9:46
15      */
16     void saleBag(String brand);
17 
18 }

2. 被代理類

 1 /**
 2  * description
 3  *
 4  * @author 70KG
 5  * @date 2018/8/1
 6  */
 7 public class CompanyA implements IBusinessA {
 8 
 9     @Override
10     public void saleBag(String brand) {
11         System.out.println("從國外A公司買到一款" + brand + "牌的包。");
12     }
13     
14 }

3. 代理類

 1 /**
 2  * description
 3  *
 4  * @author 70KG
 5  * @date 2018/8/1
 6  */
 7 public class ProxyClassBean implements IBusinessA {
 8 
 9     private CompanyA companyA;
10 
11     @Override
12     public void saleBag(String brand) {
13         // 購買前增強
14         doBefore();
15         // 通過國外公司代購產品
16         companyA.saleBag(brand);
17         // 購買后增強
18         doAfter();
19     }
20 
21     public CompanyA getCompanyA() {
22         return companyA;
23     }
24 
25     public void setCompanyA(CompanyA companyA) {
26         this.companyA = companyA;
27     }
28 
29     // ===================代理類中的增強方法========================
30 
31     public void doBefore() {
32         System.out.println("在國外尋找優質的貨源。");
33     }
34 
35     public void doAfter() {
36         System.out.println("精包裝安全郵寄回國內。");
37     }
38 }

優點:使用者只關心業務邏輯,不需要着眼內部實現,方便后期的變更和部分共用代碼的統一處理。
缺點:當代理類中出現的被代理類越來越多時,內部就會顯得非常臃腫。反而不利於管理閱讀。

動態代理和靜態代理的區別和聯系

靜態代理類:由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。
動態代理類:在程序運行時,運用反射機制動態創建而成。
靜態代理通常只代理一個類,動態代理是代理一個接口下的多個實現類。
靜態代理事先知道要代理的是什么,而動態代理不知道要代理什么東西,只有在運行時才知道。
動態代理是實現JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的業務類必須要實現接口,通過Proxy里的newProxyInstance得到代理對象。
還有一種動態代理CGLIB,代理的是類,不需要業務類繼承接口,通過派生的子類來實現代理。通過在運行時,動態修改字節碼達到修改類的目的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM