CGlib代理技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;  

2.   

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;  

2.   

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();  

12.     }  

13. }

 

 


以上是关于CGlib代理技术的主要内容,如果未能解决你的问题,请参考以下文章

CGLib动态代理原理及实现

CGLib动态代理原理及实现

CGLib动态代理原理及实现

CGLib方式对接口实现代理

Cglib动态代理实现及原理

Cglib动态代理实现及原理