SpringAop如何通過某個子類切父類
SpringAop通過某個子類切父類
偽代碼如下
package com.zjy; public abstract class A{ public void a(){ system.out.printlin("【a】方法被調(diào)用"); } } package com.zjy; public class B extends A{ public void b(){ system.out.printlin("【b】方法被調(diào)用"); } } package com.zjy; public class C extends A{ public void c(){ system.out.printlin("【c】方法被調(diào)用"); } } package com.zjy; public class D extends A{ public void d(){d system.out.printlin("【d】方法被調(diào)用"); } }
要求如下,我們想要在代碼通過B類使用a方法時候進行切面增強,通過其他類進行使用時,都不進行增強
within 和 execution的精確到類均不能對父類方法進行增強
正確方法1
@Before("execution(* com.zjy.*.*(..))") public void dealOtherServicePointcut(JoinPoint joinPoint) { Object aThis = joinPoint.getThis(); if((aThis instanceof B )){ String name = joinPoint.getSignature().getName(); log.info("進入前置方法****************************************************["+name+"]"); } }
方法1是使用com.zjy包下的所有子類進行篩選,將類進行模糊匹配
正確方法2
@Before("execution(* com.zjy..*.*(..))") public void dealOtherServicePointcut(JoinPoint joinPoint) { Object aThis = joinPoint.getThis(); if((aThis instanceof B )){ String name = joinPoint.getSignature().getName(); log.info("進入前置方法****************************************************["+name+"]"); } }
方法2是使用com.zjy包下的所有類以及下級包下的類,進行篩選,將類進行模糊匹配。
注意:
1.要使用instanceof關(guān)鍵字進行類的過濾,否則其他類也會進行增強。
2.無需考慮在增強時類需要多次代理,因為在AOP增強時只會生成一個代理類,并且大多數(shù)的類都會有代理類的生成,所以無需考慮(將沒必要的類也進行了代理,后續(xù)需要使用instanceof進行判斷對性能的降低)。
3.within 和 execution的精確到類均不能對父類方法進行增強
SpringAOP會忽略從父類繼承的方法
在項目中,我想攔截所有的dao類,結(jié)構(gòu)如下:
dao
?? ---| generic
??????????? ---| GenericDao
?? ---| GoodsDao
?? ---| SupermarketDao
?? ---| UserDao
下面的三個dao 繼承自 統(tǒng)一的父類(GenericDao),在beans.xml中,我只攔截了下面的三個子類,beans.xml中的部分代碼如下:
<aop:aspect id="myAspect" ref="loggerAop"> <aop:pointcut id="daoPointcut" expression="execution(* com.shop.jn.dao.*.*(..))" /> <aop:around pointcut-ref="daoPointcut" method="around" /> </aop:aspect>
結(jié)果從GenericDao 中繼承下來的方法都沒有被aop 攔截到。
如何解決這個問題呢?
讓切面也匹配父類(同時匹配父類和子類),修改如下:
<aop:aspect id="myAspect" ref="loggerAop"> <aop:pointcut id="daoPointcut" expression="execution(* com.shop.jn.dao..*.*(..))" /> <aop:around pointcut-ref="daoPointcut" method="around" /> </aop:aspect>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
AbstractQueuedSynchronizer內(nèi)部類Node使用講解
這篇文章主要為大家介紹了AbstractQueuedSynchronizer內(nèi)部類Node使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07關(guān)于JAVA8的 Stream學(xué)習(xí)
這篇文章主要介紹了JAVA8 Stream學(xué)習(xí)方法的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09簡單說明Java的Struts框架中merge標(biāo)簽的使用方法
這篇文章主要簡單介紹了Java的Struts框架中merge標(biāo)簽的使用方法,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12