天天看點

CGlib代理技術

一、CGlib原理

jdk實作動态代理需要實作類通過接口定義業務方法,對于沒有接口的類,如何實作動态代理呢?這就需要CGlib了,CGlib采用非常底層的位元組碼技術,其原理是用位元組碼技術為一個類建立子類,并在子類中采用方法攔截的技術攔截所有父類方法的調用,順勢織入橫切邏輯。JDK動态代理和CGlib動态代理均是實作SpringAop的基礎。

二、代碼實作

1. package net.battier.dao.impl;  

2.   

3. /** 

4.  * 這個是沒有實作接口的實作類 

5.  *  

6.  * @author student 

7.  *  

8.  */  

9. public class BookFacadeImpl1 {  

10.     public void addBook() {  

11.         System.out.println("增加圖書的普通方法...");  

12.     }  

13. }  

1. package net.battier.proxy;  

3. import java.lang.reflect.Method;  

4.   

5. import net.sf.cglib.proxy.Enhancer;  

6. import net.sf.cglib.proxy.MethodInterceptor;  

7. import net.sf.cglib.proxy.MethodProxy;  

8.   

9. /** 

10.  * 使用cglib動态代理 

11.  *  

12.  * @author student 

13.  *  

14.  */  

15. public class BookFacadeCglib implements MethodInterceptor {  

16.     private Object target;  

17.   

18.     /** 

19.      * 建立代理對象 

20.      *  

21.      * @param target 

22.      * @return 

23.      */  

24.     public Object getInstance(Object target) {  

25.         this.target = target;  

26.         Enhancer enhancer = new Enhancer();  

27.         enhancer.setSuperclass(this.target.getClass());  

28.         // 回調方法  

29.         enhancer.setCallback(this);  

30.         // 建立代理對象  

31.         return enhancer.create();  

32.     }  

33.   

34.     @Override  

35.     // 回調方法  

36.     public Object intercept(Object obj, Method method, Object[] args,  

37.             MethodProxy proxy) throws Throwable {  

38.         System.out.println("事物開始");  

39.         proxy.invokeSuper(obj, args);  

40.         System.out.println("事物結束");  

41.         return null;  

42.   

43.   

44.     }  

45.   

46. }  

1. package net.battier.test;  

3. import net.battier.dao.impl.BookFacadeImpl1;  

4. import net.battier.proxy.BookFacadeCglib;  

5.   

6. public class TestCglib {  

7.       

8.     public static void main(String[] args) {  

9.         BookFacadeCglib cglib=new BookFacadeCglib();  

10.         BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());  

11.         bookCglib.addBook();  

13. }

繼續閱讀