javascript
了解动态代理: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
翻譯自: https://www.javacodegeeks.com/2013/04/understanding-dynamic-proxy-spring-aop-basics.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的了解动态代理:Spring AOP基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机系统崩溃如何让电脑系统崩溃
- 下一篇: 自定义Spring命名空间使JAXB更容