2013-01-09 81 views
0

我想創建一個切入點表達式來攔截對包com.xmy.package及其子包中的所有類的所有方法調用。我的XML,代碼看起來像下面Spring AOP Poincut表達式

<aop:config> 
    <aop:pointcut id="allCalls" expression="within(com.xmy.package..*)" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="allCalls" /> 
    </aop:aspect> 
</aop:config> 

產生的原因:org.springframework.aop.framework.AopConfigException:無法生成類...... .. 的CGLIB子類。 。 。 。導致:java.lang.IllegalArgumentException:超類沒有空構造函數,但沒有給出參數 at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) at net.sf.cglib.proxy .Enhancer.generateClass(Enhancer.java:499) at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25 )at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) at net.sf.cglib.proxy .Enhancer.create(Enhancer.java:285) at org.springframework.aop.framework.Cglib2AopProxy.getPr氧(Cglib2AopProxy.java:201)

但是,當我使用切入點表達式爲一個特定的類(如下)它工作正常。

<aop:config> 
    <aop:pointcut id="classCalls" expression="execution(* com.xmy.package.MyClass.*(..))" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="classCalls" /> 
    </aop:aspect> 
</aop:config> 

請讓我知道如何將所有方法調用記錄到特定包及其子包。

回答

0

針對特定包及其子包中所有方法調用的切點。例如 com.xmy.package1.subpackages ... com.xmy.package2.subpackages ...

<aop:config> 
    <aop:pointcut id="pkg1AllCalls" expression="execution (* com.xmy.package1+*())" /> 
    <aop:pointcut id="pkg2AllCalls" expression="execution (* com.xmy.package2+*())" /> 
    <aop:aspect ref="loggingService"> 
     <aop:around method="logMethodFlow" pointcut-ref="pkg1AllCalls" /> 
     <aop:around method="someOtherMethod" pointcut-ref="pkg2AllCalls" /> 
    </aop:aspect> 
</aop:config> 

即定義2個不同的切入點,使表達式既簡潔和可維護性。 注意someOtherMethod()是我添加新的使用兩個不同的切入點。

有與基於XML的風格限制,如果你不得不合並兩個切入點如上圖所示參考:6.4.2節春季文檔的3.0

然而,這可以很容易地爲@AspectJ

使用時實現
@Pointcut(execution(* get*())) 
    public void propertyAccess() {} 

    @Pointcut(execution(org.xyz.Account+ *(..)) 
    public void operationReturningAnAccount() {} 

    @Pointcut(propertyAccess() && operationReturningAnAccount()) 
    public void accountPropertyAccess() {}