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