标签: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
原文地址:http://blog.51cto.com/12222886/2046219