0

我想创建一个切入点表达式来拦截对包 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 has no null constructors but no arguments are given at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:721) at net.sf.cglib.proxy.Enhancer。 generateClass(Enhancer.java:499) 在 net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) 在 net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 在 net.sf .cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) 在 net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) 在 net.sf.cglib.proxy.Enhancer.create(Enhancer.java :

但是当我对特定类(如下)使用切入点表达式时,它可以正常工作。

<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>

请让我知道如何记录对特定包及其子包的所有方法调用。

4

1 回答 1

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 的样式有一个限制如果您必须合并两个切入点,如上所示参考:Spring Docs 3.0 的 6.4.2 部分

然而,当用作@AspectJ 时,这很容易实现

@Pointcut(execution(* get*()))
  public void propertyAccess() {}

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

  @Pointcut(propertyAccess() && operationReturningAnAccount())
  public void accountPropertyAccess() {}
于 2013-01-18T19:32:29.293 回答