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

歡迎訪問 生活随笔!

生活随笔

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

javascript

了解动态代理:Spring AOP基础

發布時間:2023/12/3 javascript 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 了解动态代理:Spring AOP基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么選擇AOP:

要了解AOP(面向方面??的編程),我們需要了解軟件開發中的“橫切關注點”。 在每個項目中,都有一定數量的代碼在多個類,多個模塊中重復執行,例如幾乎所有類和所有模塊都需要記錄日志。

這類代碼降低了代碼的可重用性,可維護性和可伸縮性。例如,如果您要使用該類并在不需要日志的其他地方重用它,則必須更改該類。 同樣,如果更改了驗證或日志記錄,則無論使用什么地方,我們都必須改變幾乎每個類。

一個類應該專注于它的核心功能,諸如日志記錄,驗證,事務之類的東西不是該類功能的一部分。 面向方面的編程是幫助我們消除這些交叉問題的范例。 它為我們提供了將我們的交叉代碼與類分開的工具和方法。

代理模式:

我們可以創建對象的代理,該代理將處理交叉關注代碼。代理模式有兩種:

  • 靜態代理:

    在這里我們為每個類創建一個代理對象。 這是不可行的

  • 動態代理:

    在此,通過反射動態創建代理。 此功能是從JDK 1.3中添加的。 動態代理構成Spring AOP的基本構建塊

在這里,類Example1實現接口BasicFunc。

package com.somaniab.blog.ex;public class Example1 implements Basicfunc{@Overridepublic void method1() {System.out.println("executing method 1"); }}

這是接口Basicfunc

package com.somaniab.blog.ex;public interface Basicfunc{public void method1(); }

現在,如果要計算method1的執行時間,我們必須在方法本身中編寫該代碼,或者我們可以創建一個代理對象。 為了創建代理對象,我們創建一個Invocationhandler,如下所示:

package com.somaniab.blog.ex;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler{private Object target ;public MyInvocationHandler(Object target){this.target = target;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] params)throws Throwable {long a = System.currentTimeMillis();Object result =method.invoke(target ,params);System.out.println("total time taken "+(System.currentTimeMillis()-a));return result;}}

在此調用處理程序中,我們調用實際方法并計算所需的時間?,F在,在主類中,我們使用Proxy類創建代理對象。

package com.somaniab.blog.ex;import java.lang.reflect.Proxy;public class MainClass {public static void main(String[] args) {Example1 ex = new Example1();Basicfunc proxied =(Basicfunc)Proxy.newProxyInstance(MainClass.class.getClassLoader(),ex.getClass().getInterfaces() ,new MyInvocationHandler(ex));proxied.method1();} }

為了創建Proxy,我們傳遞了classloader(幾乎與原始類相同的classloader),接口和invocationHandler(在調用處理程序中傳遞了原始目標對象)。 原始類必須實現一個接口,只有接口中聲明的那些方法才被代理,然后我們將代理轉換為接口類型。

如果您收到這樣的異常: java.lang.ClassCastException:$ Proxy0無法轉換為com.somaniab.blog.ex.Example1 ,則意味著您的目標類未實現該接口。

在CGLib Proxy中,沒有必要聲明接口。 因此,這就是我們確保示例類僅為method1編寫代碼的方式,并且將執行時間計算代碼保留在其中。 這是一個非?;镜氖纠?#xff0c;但它是Spring AOP的基礎。 除了Spring AOP以外,其他實現aop的框架是AspectJ和JBOSS AOP

參考: 了解動態代理: JCG合作伙伴 Abhishek Somani在Java,J2EE和Server博客上的Spring AOP基礎知識 。

翻譯自: https://www.javacodegeeks.com/2013/04/understanding-dynamic-proxy-spring-aop-basics.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的了解动态代理:Spring AOP基础的全部內容,希望文章能夠幫你解決所遇到的問題。

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