cblib實現JDK動態代理的簡單實例

JDK已經默認實現了動態代理,爲什麼還要引入cblib的代態代理呢?JDK的動態代碼可以看一下我們的上一篇文章,因爲JDK的動態代理只能代碼實現了接口的類。如果是沒有實現接口的類,這裏我們就需要使用cglib進行代理了,在spring和hibernate中都是廣泛使用,它是通過動態的生成了一個子類去覆蓋所有代理類的不是final的方法,並設置好callback,則原有類的每個方法的調用就會轉變成調用用戶定義的攔截方法。廢話不多說。我們直接看一個最簡單的例子,方便直觀。
1:引入依賴JAR包,這個JAR包含了cglib所有的包,只需要引入這一個就可以了
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-full</artifactId>
<version>2.0.2</version>
</dependency>
2:創建目標類,也就是需要代理的類
public class CglibTarget {
public void addUser() {
// 這裏我們只打印一句話,在實際運用中,是加入你的邏輯代碼
System.out.println("----------調用了add方法-------------");
}
}
3:創建代理類
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//創建代理類
public class FirstInterceptor implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz) {
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}

public Object intercept(Object object, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
// 調用方法之前的操作,添加你的業務邏輯代碼,這裏我們只打印一句話
System.out.println("----調用方法之前執行的代碼----");

Object result = methodProxy.invokeSuper(object, args);

// 調用方法之後的操作,添加你的業務邏輯代碼,這裏我們只打印一句話
System.out.println("----調用方法之後執行的代碼----");
return result;
}
}
4:創建測試方法
public static void main(String[] args) {
FirstInterceptor firstInterceptor = new FirstInterceptor();
CglibTarget cglibTarget = (CglibTarget) firstInterceptor.getProxy(CglibTarget.class);
cglibTarget.addUser();
}
5:輸出結果
----調用方法之前執行的代碼----
----------調用了add方法-------------
----調用方法之後執行的代碼----
這樣就可以看到,在生調用目標類的方法之前和之後,分別執行了我們加入的邏輯代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章