日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring 初识Aop JDK动态代理实现 原理初显

發(fā)布時間:2025/3/19 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 初识Aop JDK动态代理实现 原理初显 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring 初識Aop JDK動態(tài)代理實現 原理初顯

    • 一、項目結構
    • 二、具體步驟:
      • 1、創(chuàng)建maven項目 創(chuàng)建好包結構
      • 2、寫一個TestDao接口 及實現類
      • 3、 寫一個自己的切面類
      • 4、java JDK 實現動態(tài)代理
      • 5、JDK 動態(tài)代理測試
      • 6、Cglib 實現動態(tài)代理
      • 7、Cglib 測試
    • 三、自言自語

Spring-AOP-理論知識

一、項目結構

二、具體步驟:

1、創(chuàng)建maven項目 創(chuàng)建好包結構

2、寫一個TestDao接口 及實現類

/*** @version 1.0* @author: crush* @date: 2021-03-05 10:26*/ public interface TestDao {public void sayHello();public void save();public void modify();public void delete(); }

TestDaoImpl

/*** @version 1.0* @author: crush* @date: 2021-03-05 10:27*/ @Repository public class TestDaoImpl implements TestDao {public void sayHello() {System.out.println("武漢加油!中國加油!");}public void save() {System.out.println("保存");}public void modify() {System.out.println("修改");}public void delete() {System.out.println("刪除");} }

3、 寫一個自己的切面類

/*** @version 1.0* @author: crush* @date: 2021-03-10 11:41*/ public class MyAspect {public void check(){System.out.println("模擬權限處理");}public void except(){System.out.println("模擬異常處理");}public void log(){System.out.println("模擬日志記錄");}public void monitor(){System.out.println("性能檢測");} }

4、java JDK 實現動態(tài)代理

/*** @version 1.0* @author: crush* @date: 2021-03-10 11:47** InvocationHandler是由代理實例的調用處理程序實現的接口。* 每個代理實例都有一個關聯的調用處理程序。* 在代理實例上調用方法時,該方法調用將被編碼并分派到其調用處理程序的invoke方法*/ public class JdkDynamicProxy implements InvocationHandler {private Object object;/*** @Date 16:24 2021/3/10** 創(chuàng)建代理的方法 建立代理對象和真實對象的代理關系 并返回代理對象**/public Object createProxy(Object object){this.object=object;// 1、 類加載器ClassLoader classLoader = JdkDynamicProxy.class.getClassLoader();// 2、 被代理對象 實現的所有接口Class[] interfaces = object.getClass().getInterfaces();// 3、 使用代理類進行增強 返回代理后的對象/*** 利用Java的反射技術(Java Reflection),* 在運行時創(chuàng)建一個實現某些給定接口的新類(也稱“動態(tài)代理類”)及其實例(對象),* 代理的是接口(Interfaces),不是類(Class),也不是抽象類。* 在運行時才知道具體的實現,spring aop就是此原理*/return Proxy.newProxyInstance(classLoader,interfaces,this);/*** newProxyInstance,方法有三個參數:** loader: 用哪個類加載器去加載代理對象** interfaces:動態(tài)代理類需要實現的接口** h:動態(tài)代理方法在執(zhí)行時,會調用h里面的invoke方法去執(zhí)行*/}/*** @Param [proxy 是被代理的對象,* method 是將要被執(zhí)行的方法,* args 是執(zhí)行方法 時需要的參數]* @return java.lang.Object** 處理代理實例上的方法調用并返回結果。在與之關聯的代理實例上調用方法時,將在調用處理程序上調用該方法。** invoke 三個參數* proxy:就是代理對象,newProxyInstance方法的返回對象** method:調用的方法** args: 方法中的參數**/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {MyAspect myAspect = new MyAspect();myAspect.check();myAspect.except();// 在目標類上調用方法并傳入參數 相當于調用testDao中的方法Object obj = method.invoke(object, args);myAspect.log();myAspect.monitor();return obj;} }

5、JDK 動態(tài)代理測試

@Testpublic void JdkDynamicTest(){//創(chuàng)建代理對象JdkDynamicProxy proxy = new JdkDynamicProxy();//創(chuàng)建目標對象TestDao testDao = new TestDaoImpl();/*** 從代理對象中獲取到增強后的目標對象,* 該對象是一個被代理的對象* 它會進入到代理的邏輯方法 invoke 中*/TestDao testAdvice = (TestDao) proxy.createProxy(testDao);// 執(zhí)行方法testAdvice.sayHello();}

6、Cglib 實現動態(tài)代理

/*** @version 1.0* @author: crush* @date: 2021-03-10 16:23*/ public class CglibDynamicProxy implements MethodInterceptor {/*** @Param [o, method, objects, methodProxy]* 創(chuàng)建代理的方法 生成CGLIB代理對象* target 是目標對象 需要增強的對象* 返回目標對象的CGLIB 代理對象**/public Object creatProxy(Object target){// 創(chuàng)建一個動態(tài)類對象 即增強類對象Enhancer enhancer = new Enhancer();// 確定需要增強的類 設置其父類//超類 – 要擴展的類或要實現的接口enhancer.setSuperclass(target.getClass());// 確定代理邏輯對象為當前對象// 要求當前對象實現MethodInterceptor 的方法enhancer.setCallback(this);// 返回創(chuàng)建的代理對象return enhancer.create();}/*** @Param [o, method, objects, methodProxy]* intercept 方法慧再程序執(zhí)行目標方法時被調用* proxy 是CGLIB 根據指定父類生成的代理對象* method 是攔截方法* args 是攔截方法的參數數組* methodProxy 是方法代理對象 擁有執(zhí)行父類的方法 返回代理結果**/@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {MyAspect myAspect = new MyAspect();myAspect.check();myAspect.except();// 在目標類上調用方法并傳入參數 相當于調用testDao中的方法Object obj = methodProxy.invokeSuper(proxy, args);myAspect.log();myAspect.monitor();return obj;} }

7、Cglib 測試

@Testpublic void CglibDynamicProxyTest(){// 創(chuàng)建代理對象CglibDynamicProxy proxy = new CglibDynamicProxy();// 創(chuàng)建目標對象TestDao testDao = new TestDaoImpl();//獲取增強后的目標對象TestDao testAdvice = (TestDao) proxy.creatProxy(testDao);//執(zhí)行方法testAdvice.save();}

三、自言自語

又到一天中課間休息時間拉。
再看張好看的圖。欣賞來自大自然的美麗。

總結

以上是生活随笔為你收集整理的Spring 初识Aop JDK动态代理实现 原理初显的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。