Java代理模式

Java動態代理主要用於對代理類進行某種增強,比如在方法執行前增加某個操作,執行後增加某個操作等。。。

spring就是通過動態代理實現面向切面編程(spring aop),同時日誌記錄也用到了動態代理。

Java代理模式實現方式有兩種: 靜態代理  動態代理

靜態代理:在委託類中持有被代理類的對象,同時實現被代理類的所有方法

package cn.suntech.test;
//定義一個接口,並定義兩個方法
public interface Bank {
    
    public void save();
    public void get();
    
}

package cn.suntech.test;
//定義一個接口實現類
public class BankImpl implements Bank{

    @Override
    public void save() {
        System.out.println("存錢...");
        
    }

    @Override
    public void get() {
        System.out.println("取錢...");
        
    }
    
}
package cn.suntech.test;
//代理類  這裏代理類不一定需要實現Bank接口,只需要持有Bank接口的實現類並實現接口中定義的方法即可
//代理類中的方法名一般保持與接口中的方法名一致
public class BankProxy implements Bank{
    
    private Bank bank;
    public BankProxy(Bank bank){
        this.bank = bank;
    }
    @Override
    public void save() {
        System.out.println("存錢之前的自定義操作...");
        bank.save();
        System.out.println("存錢之後的自定義操作...");
        
    }
    @Override
    public void get() {
        System.out.println("取錢之前的自定義操作...");
        bank.save();
        System.out.println("取錢之後的自定義操作...");
    }
    
    //測試
    public static void main(String[] args) {
        Bank bank = new BankImpl();
        BankProxy proxy = new BankProxy(bank);
        proxy.save();
        proxy.get();
        
    }
}

通過這種靜態代理的方式,就可以實現對指定接口中方法進行增強。我們可以在執行相應方法之前執行自己需要的操作,比如記錄日誌。。。

但是使用這種方式也存在一些弊端:

這種靜態代理實現,每一個被代理類(委託類)都需要一個代理類,這樣如果委託類過多,那麼因此生成的代理類也會非常龐大,動態代理很好的解決了這一問題。





1. Java動態代理,JDK和CGLIB

http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

2. 使用示例

http://blog.csdn.net/leon709/article/details/9529307

3. Java動態代理機制詳解(JDK 和CGLIB,Javassist,ASM)

http://blog.csdn.net/luanlouis/article/details/24589193 

4. Java動態代理與Cglib庫

http://blog.csdn.net/zhoudaxia/article/details/30591941


發佈了14 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章