JavaEE AOP動態代理——CGLIB代理
阿新 • • 發佈:2018-12-11
JDK動態代理的使用非常簡單,但他還有一定的侷限性——使用動態代理的物件必須是實現了介面的類,如果要對沒有實現介面的類進行代理那麼就可以使用CGLIB代理
接下來通過一個案例來演示CGLIB代理的實現過程
1、在src目錄下建立一個com.itheima.cglib包,在包中建立一個類UserDao,不需要實現任何介面,只需要定義一個新增使用者和一個刪除使用者方法,程式碼如下所示:
package com.itheima.cglib; public class UserDao { public void addUser() { System.out.println("新增使用者"); } public void deleteUser() { System.out.println("刪除使用者"); } }
2、在com.itheima.cglib包中建立代理類CglibProxy,該代理類需要實現MethodInterceptor介面,並實現介面中的intercept()方法,程式碼如下(在下面的程式碼中需要匯入MyAspect這個類,此類和上一篇文章中的一樣,不清楚的點選這)
package com.itheima.cglib; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import com.itheima.aspect.MyAspect; //代理類 public class CglibProxy implements MethodInterceptor { //代理方法 public Object createProxy(Object target) { //建立一個動態類物件 Enhancer enhancer = new Enhancer(); //確定需要增強的類,設定其父類 enhancer.setSuperclass(target.getClass()); //設定回撥函式 enhancer.setCallback(this); //返回建立的代理類 return enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //建立切面類物件 MyAspect myAspect = new MyAspect(); //前增強 Object obj = methodProxy.invokeSuper(proxy, args); //後增強 myAspect.log(); return obj; } }
3、在com.itheima.cglib包中,建立測試類CglibTest。在該類的main()方法中首先建立代理物件和目標物件,然後從代理物件獲得增強後的目標物件,最後呼叫物件的新增和刪除方法,程式碼如下所示:
package com.itheima.cglib; public class CglibTest { public static void main(String[] args) { //建立代理物件 CglibProxy cglibProxy = new CglibProxy(); //建立目標物件 UserDao userDao = new UserDao(); //獲取增強後的目標物件 UserDao userDao2 = (UserDao) cglibProxy.createProxy(userDao); //執行方法 userDao2.addUser(); userDao2.deleteUser(); } }
4、執行程式後,輸出結果如下:
從輸出結果來看,UserDao中的方法確實被增強了