Spring AOP Pointcut表达式

时间:2013-01-09 08:37:41

标签: spring-aop

我想创建一个切入点表达式来拦截对com.xmy.package包及其子包中所有类的所有方法调用。我的xml,代码如下所示

<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子类......   ..   。   。   。   。   .Caused by:java.lang.IllegalArgumentException:Superclass没有null构造函数但没有给出参数           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)           在net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)           在org.springframework.aop.framework.Cglib2AopProxy.getProxy(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>

请告诉我如何将所有方法调用记录到特定软件包及其子软件包。

1 个答案:

答案 0 :(得分: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的样式存在限制如果必须合并两个切入点,如上所示ref:6.4.2 Spring Docs 3.0的部分

然而,当用作@AspectJ

时,这很容易实现
@Pointcut(execution(* get*()))
  public void propertyAccess() {}

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

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