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

