码迷,mamicode.com
首页 > 其他好文 > 详细

CGlib代理技术

时间:2017-11-30 20:59:18      阅读:162      评论:0      收藏:0      [点我收藏+]

标签: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

原文地址:http://blog.51cto.com/12222886/2046219

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!