spring中的CGLIB动态代理(代码)
生活随笔
收集整理的這篇文章主要介紹了
spring中的CGLIB动态代理(代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
因為jdk帶來具有局限性,使用動態代理的對象必須實現一個或多個接口,CGLIB代理不需要實現接口
UserDao.java目標類:
package com.liu.cglib;//目標類 public class UserDao {public void addUser() {System.out.println("添加方法");}public void deleteUser() {System.out.println("刪除方法");}}CglibProxy.java代理類:
package com.liu.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.liu.aspect.MyAspect;public class CglibProxy implements MethodInterceptor{//創建代理方法public Object createProxy(Object object) {//創建一個動態類對象Enhancer enhancer = new Enhancer();//確定需要增強的類 設置其父類enhancer.setSuperclass(object.getClass());//添加回調函數enhancer.setCallback(this);//返回創建的代理類return enhancer.create();}//proxy cglib根據定義的父類生成的代理對象//method 攔截的方法//args 攔截的方法的參數數組//methProxy 方法的代理對象 用于執行父類的方法@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methProxy) throws Throwable {// TODO Auto-generated method stub//創建切面對象MyAspect myAspect = new MyAspect();//前置增強myAspect.chek();//目標方法執行Object obj = methProxy.invokeSuper(proxy, args);//后置增強myAspect.log();return obj;}}MyAspect.java切面類:
package com.liu.aspect;//切面類:里面可以存在多個advice通知方法 也就是增強類 public class MyAspect {public void chek() {System.out.println("模擬檢查方法....");}public void log() {System.out.println("模擬記錄日志....");} }CglibTest.java測試類:
package com.liu.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();}}運行結果:
模擬檢查方法.... 添加方法 模擬記錄日志.... 模擬檢查方法.... 刪除方法 模擬記錄日志....JDK動態代理:https://blog.csdn.net/weixin_45151960/article/details/104602936
總結
以上是生活随笔為你收集整理的spring中的CGLIB动态代理(代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring中的jdk动态代理(代码步骤
- 下一篇: ProxyFactoryBean(代码)