一。JDK中使用 實現了InvocationHandler接口的方式來進行動態代理,而cglib則使用 實現了 MethodInterceptor 接口的方式來進行動態代理。
但是,JDK的動態代理依靠接口實現,如果有些類並沒有實現接口,則不能使用JDK代理, 這就要使用cglib動態代理了。cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類, 並覆蓋其中方法實現增強,但因爲採用的是繼承,所以不能對final修飾的類進行代理。因此,總的來說,用cglib會更好點。
二。準備好相關JAR包,引入JDK,以及 cglib-nodep-2.2.2.jar包等。
三。通過JDK實現的動態代理,例子如下:
IBusi.java
package com.ffcs.icity.proxy.jdk;
public interface IBusi {
public void test();
}
BusiImpl.java
package com.ffcs.icity.proxy.jdk;
public class BusiImpl implements IBusi {
@Override
public void test() {
System.out.println("這邊開始進行業務操作.");
}
}
BusiProxy.java
package com.ffcs.icity.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* JDK動態代理代理類
* @author linwei
*
*/
public class BusiProxy implements InvocationHandler{
private Object target;
/**
* 綁定委託對象並返回一個代理類
* @param target
* @return
*/
public Object bind(Object target) {
this.target = target;
//取得代理對象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this); //要綁定接口(這是一個缺陷,cglib彌補了這一缺陷)
}
@Override
/**
* 調用方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
System.out.println("事物開始");
//執行方法
result=method.invoke(target, args);
System.out.println("事物結束");
return result;
}
}
package com.ffcs.icity.proxy.jdk;
/**
* 但是,JDK的動態代理依靠接口實現,如果有些類並沒有實現接口,則不能使用JDK代理,
* 這就要使用cglib動態代理了。
* @author linwei
*
*/
public class TestProxy {
public static void main(String[] args) {
BusiProxy t = new BusiProxy();
IBusi busi = (IBusi)t.bind(new BusiImpl());
busi.test();
}
}
四。通過cglib實現的動態代理,例子如下:
ICgligBusi.java
package com.ffcs.icity.proxy.cglib;
public interface ICgligBusi {
public void test();
}
CglibBusiImpl.java
package com.ffcs.icity.proxy.cglib;
public class CglibBusiImpl implements ICgligBusi {
@Override
public void test() {
System.out.println("這邊開始進行業務操作.");
}
}
CglibBusiProxy.java
package com.ffcs.icity.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 使用cglib進行動態代理工作
* @author linwei
*
*/
public class CglibBusiProxy implements MethodInterceptor {
private Object target;
/**
* 創建代理對象
*
* @param target
* @return
*/
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回調方法
enhancer.setCallback(this);
// 創建代理對象
return enhancer.create();
}
@Override
// 回調方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("事物開始");
proxy.invokeSuper(obj, args);
System.out.println("事物結束");
return null;
}
}
TestCglibProxy.java
package com.ffcs.icity.proxy.cglib;
/**
* cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,
* 並覆蓋其中方法實現增強,但因爲採用的是繼承,所以不能對final修飾的類進行代理。
* @author linwei
*
*/
public class TestCglibProxy {
public static void main(String[] args) {
CglibBusiProxy cglibProxy = new CglibBusiProxy();
ICgligBusi busi = (ICgligBusi)cglibProxy.getInstance(new CglibBusiImpl());
busi.test();
}
}