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方法時候進(jìn)行切面增強(qiáng),通過其他類進(jìn)行使用時,都不進(jìn)行增強(qiáng)
within 和 execution的精確到類均不能對父類方法進(jìn)行增強(qiáng)
正確方法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("進(jìn)入前置方法****************************************************["+name+"]");
}
}
方法1是使用com.zjy包下的所有子類進(jìn)行篩選,將類進(jìn)行模糊匹配
正確方法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("進(jìn)入前置方法****************************************************["+name+"]");
}
}
方法2是使用com.zjy包下的所有類以及下級包下的類,進(jìn)行篩選,將類進(jìn)行模糊匹配。
注意:
1.要使用instanceof關(guān)鍵字進(jìn)行類的過濾,否則其他類也會進(jìn)行增強(qiáng)。
2.無需考慮在增強(qiáng)時類需要多次代理,因?yàn)樵贏OP增強(qiáng)時只會生成一個代理類,并且大多數(shù)的類都會有代理類的生成,所以無需考慮(將沒必要的類也進(jìn)行了代理,后續(xù)需要使用instanceof進(jìn)行判斷對性能的降低)。
3.within 和 execution的精確到類均不能對父類方法進(jìn)行增強(qiáng)
SpringAOP會忽略從父類繼承的方法
在項(xiàng)目中,我想攔截所有的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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一次線上websocket返回400問題排查的實(shí)戰(zhàn)記錄
最近項(xiàng)目中有端對端通信場景,實(shí)時性要求較高,考慮后選用了websocket 這一通信協(xié)議,下面這篇文章主要給大家介紹了一次線上websocket返回400問題排查的實(shí)戰(zhàn)記錄,需要的朋友可以參考下2022-04-04
Spring Cloud Stream整合RocketMQ的搭建方法
本文介紹了如何使用SpringCloudStream整合RocketMQ進(jìn)行消息傳遞,SpringCloudStream是一個用于構(gòu)建與共享消息系統(tǒng)連接的框架,支持持久pub/sub語義和消費(fèi)者組,感興趣的朋友跟隨小編一起看看吧2024-11-11
Spring Security實(shí)現(xiàn)基于角色的訪問控制框架
Spring Security是一個功能強(qiáng)大的安全框架,提供了基于角色的訪問控制、身份驗(yàn)證、授權(quán)等安全功能,可輕松保護(hù)Web應(yīng)用程序的安全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04
elasticsearch的靈魂唯一master選舉機(jī)制原理分析
這篇文章主要為大家介紹了elasticsearch的靈魂唯一master選舉機(jī)制原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

