一、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. }