您好,登錄后才能下訂單哦!
Spring AOP實(shí)現(xiàn)日志框架的示例?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
首先,在項(xiàng)目包c(diǎn)om.ay.test 下創(chuàng)建業(yè)務(wù)接口類BusinessClassService,具體代碼如下:
BusinessC lassService 業(yè)務(wù)接口類可以理解為日常開(kāi)發(fā)業(yè)務(wù)創(chuàng)建的接口類, 接口中有一個(gè)簡(jiǎn) 單的方法doSomeThing 。然后,開(kāi)發(fā)業(yè)務(wù)類的實(shí)現(xiàn)類BusinessClassServiceImpl,具體代碼如下:
實(shí)現(xiàn)類BusinessClassServicelmpl 實(shí)現(xiàn)了BusinessClassServ ice 接口, 并實(shí)現(xiàn)了doSomeThing 方法,在方法中打印“ do something ......” 。接著,開(kāi)發(fā)日志接口類My Logger , 具體代碼如下:
• savelntoMethodTime : 記錄進(jìn)入方法的時(shí)間。 • saveOutMethodTime : 記錄退出方法的時(shí)間。 接口類MyLogger 開(kāi)發(fā)完成之后,用MyLoggerlmpl 類實(shí)現(xiàn)它, 具體代碼如下:
MyLoggerlmpl 類實(shí)現(xiàn)接口MyLogger , 并實(shí)現(xiàn)savelntoMethodTime 和saveOutMethodTime 方法,在方法內(nèi)部打印進(jìn)入/退出方法的時(shí)間。 最后, 實(shí)現(xiàn)最重要的類MyLoggerHandler , 具體代碼如下:
• lnvocationHandler : 該接口中僅定義了一個(gè)方法: public Object invoke(Object obj, Method method, Object[] args) , 在使用時(shí),第一個(gè)參數(shù)obj 一般是指代理類, method是 被代理的方法, args為該方法的參數(shù)數(shù)組。這個(gè)抽象方法在代理類中動(dòng)態(tài)實(shí)現(xiàn)。 所有的代碼開(kāi)發(fā)完成之后,開(kāi)發(fā)測(cè)試類MyLoggerTest 進(jìn)行測(cè)試, 具體代碼如下:
• Proxy . newProxylnstance :該類即為動(dòng)態(tài)代理類, static Object newProxylnstance (ClassLoader loader, Class[] interfaces, JnvocationHandler h),返回代理類的一個(gè)實(shí)例,返 回后的代理類可以當(dāng)作被代理類使用。在Proxy.new Proxy Instance方法中,共有以下三 個(gè)參數(shù): • Classloader loader: targetObject.getClass().getClassLoader()目標(biāo)對(duì)象通過(guò)getClass 方法獲取類的所有信息后,調(diào)用getClassLoader()方法來(lái)獲取類加載器。獲取類力口載 器后,可以通過(guò)這個(gè)類型的加載器,在程序運(yùn)行時(shí),將生成的代理類力口載到JVM即 Java虛擬機(jī)中,以使運(yùn)行時(shí)需要。 •Class[] interfaces: targetObject.getClass().getinterfaces()獲取被代理類的所有接口信 息,以便于生成的代理類可以具有代理類接口中的所有方法。 • lnvocationHandler h : 使用動(dòng)態(tài)代理是為了更好地?cái)U(kuò)展, 比如在方法之前做什么操 作,之后做什么操作,這個(gè)時(shí)候這些公共的操作可以統(tǒng)一交給代理類去做。此時(shí)需 要調(diào)用實(shí)現(xiàn)了InvocationHandler 類的一個(gè)回調(diào)方法。
運(yùn)行測(cè)試類的ma in 方法,便可以在Intellij IDEA 控制臺(tái)查看打印信息,具體信息如下:
以上就是利用動(dòng)態(tài)代理模式實(shí)現(xiàn)簡(jiǎn)單的日志框架, 具體的結(jié)構(gòu)如圖
這里總結(jié)一下JDK 動(dòng)態(tài)代理的一般實(shí)現(xiàn)步驟:
( l )創(chuàng)建一個(gè)實(shí)現(xiàn)InvocationHandler 接口的類MyLoggerHandler,它必須實(shí)現(xiàn)invoke 方法。
(2 )創(chuàng)建被代理的類BusinessClassService 以及接口BusinessClassServicelmpl 。
(3 )調(diào)用Proxy 的靜態(tài)方法newProxyInstance ,創(chuàng)建一個(gè)代理類。
( 4 )通過(guò)代理類調(diào)用方法。
spring aop實(shí)現(xiàn)日志框架
使用Spring AOP 的注解方式實(shí)現(xiàn)日志框架是非常簡(jiǎn)單的。首先,在配置文件 spring-mvc且nl 中添加配置, 具體代碼如下:
<aop:aspectj-autoproxy proxy-target-class="true">
</aop:aspectj-autoproxy>: 聲明自動(dòng)為Spring容器中那些配置@aspectJ切面的bean創(chuàng)建 代理,織入切面。<aop : aspectj -autoproxy />有一個(gè)proxy-target-class屬性,默認(rèn)為fal se, 表示使用JDK動(dòng)態(tài)代理織入增強(qiáng),當(dāng)配置poxy-target-class 為true 時(shí),表示使用CGLib動(dòng) 態(tài)代理技術(shù)織入增強(qiáng)。不過(guò)即使設(shè)置proxy-target-class 為fa lse ,如果目標(biāo)類沒(méi)有聲明接 口,則Spring將自動(dòng)使用CGLib動(dòng)態(tài)代理。
配置添加完成之后,要定義一個(gè)切面Loglnterceptor ,具體代碼如下:
• @Aspect : 標(biāo)識(shí)Loglntercepto r類為一個(gè)切面,供容器讀?。?• @Before : 在所攔截方法執(zhí)行之前執(zhí)行before 方法。 • @After:在所攔截方法執(zhí)行之后執(zhí)行after方法。 • @Around :可以同時(shí)在所攔截方法的前后執(zhí)行一段邏輯。 • execution 切入點(diǎn)指示符: 表示在controller 包中定義的任意方法 的執(zhí)行。execution 切入點(diǎn)指示符執(zhí)行表達(dá)式的格式如下:
翻譯為:
其中黑色字體部分不能省略,各部分都支持通配符“*”來(lái)匹配全部。比較特殊的為形參 表部分,其支持以下兩種通配符:
例如:
下面舉一些execution 的使用實(shí)例,具體內(nèi)容見(jiàn)表3 -3 。
切面類Loglnterceptor 開(kāi)發(fā)完成之后, 重新啟動(dòng)springmvc-mybatis-book 項(xiàng)目,項(xiàng)目成功啟 動(dòng)后,在瀏覽器輸入網(wǎng)址: http: //localbost: 8080/user/findAll , 便可以在lntellij IDEA 開(kāi)發(fā)工具的 控制臺(tái)看到如下的打印信息:
看完上述內(nèi)容,你們掌握Spring AOP實(shí)現(xiàn)日志框架的示例的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。