2016-11-22 141 views
0

我想創建一個本質上是動態的切入點表達式。 我有三個包 - 包1, 包2, 共同aspectj/spring中的動態切入點表達式aop

共同應始終inculded和基於系統屬性我想在任何給定的時間來加載包1或包2

類似下面

private static final String PACKAGE = System.getProperty("packagePrefix"); 

@Around("execution(* "+PACKAGE+"..*.*(..)) && execution(* ..common.*(..))") 

我該如何做到這一點?

編輯:

我發現this這是很有趣的,我想能解決我的要求,但沒有能夠得到它的工作 所以這個環節說,有一個像下面

@Aspect 
public abstract class MyAspect { 

protected abstract pointcut(); 


@Before("pointcut()") 
public void myAdviceMethod() { 
// Advice code goes here 
} 
} 


public class ConcreteAspect extends MyAspect { 

@Pointcut("execution(* com.acme.*.*(..))") 
    protected pointcut() { 
) 
} 

下面包含在我的Java配置中

@Bean 
public ConcreteAspect myAspect() { 
    return new ConcreteAspect(); 
} 

但是,嗷嗷錯誤:

java.lang.IllegalArgumentException異常:在錯誤:: 0找不到引用 切入點切入點

我想在運行時,它不是能找出被覆蓋的切入點方法,因此無法解決切入點。 任何想法如何解決這個問題?

回答

0

您可以使用內,這將掃描指定的包

@Pointcut( 「內(..common ..(..)」) 公共無效CommonPackage(){}

@Pointcut( 「內(..PACKAGE ..(..)」) 公共無效specificPackage(){}

而且使用@圍繞/ @之前或任何建議爲u需要您的具體情況 @Around (「執行(CommonPackage()& & SpecificPackage()「) 爲不同的包編寫切入點表達式並將它們綁定在一起。希望這可以幫助!

+0

感謝Sharmila的迴應。但是這個PACKAGE將如何放置在你的第二個切入點中?記住PACKAGE是字符串,它在運行時從系統屬性獲得值 – SCoder

1

你可以使用if()子句,使支票是這樣的:

aspect X { 
    before(): execution(* Code.*(..)) && 
    if(isOfInterest(thisJoinPointStaticPart.getSignature().getDeclaringType())) { 
    System.out.println("advice running"); 
    } 

    public static boolean isOfInterest(Class s) { 
    return s.getPackage().toString().startsWith(packagePrefix); 
    } 
} 

我想類似的東西將用於註釋風格的語法工作。但是這種方法將包括每個匹配連接點的運行時測試。

+0

感謝Andy的response.But我猜if()只能用於如果我必須啓用禁用通知。所以在我的情況下,我必須創建兩個建議 - 一個用於package1,另一個用於package2。所以,如果我有50包,我必須創建50個建議。我真正想要的是在運行時在表達式中替換軟件包名稱。 – SCoder

+0

您可以用您認爲合適的任何邏輯來替換「isOfInterest」方法的實現,但請記住,在您建議的每個連接點評估布爾方法的花費非常低。如果您的建議代碼未被多次調用,或者性能不重要,則不應該成爲問題。 –

+0

@NándorElődFekete - 我不能在isOfInterest中放任何邏輯,因爲它只能返回boolean.From doc - if(...)主體可以是任何有效的Java布爾表達式,並且可以使用任何公開的形式,以及連接點形成thisJoinPoint,thisJoinPointStaticPart和thisJoinPointEnclosingStaticPart。 – SCoder