1

我有两个实现 MethodInterceptor 的建议类。我想将这些建议应用于一个切入点,并在调用目标方法时选择建议。

我认为这是不可能的,所以我做了一个目标类的子类,并为子类使用切入点表达。

类看起来像:

class SuperClass implements SomeInterface {
    public int getZero() {
        return 0;
    }
}

class SubClass extends SuperClass implements SomeInterface { 
}

XML 看起来像:

<bean id="subAdvice" class="package.SomeAdvice" />
<aop:config>
    <aop:advisor advice-ref="subAdvice" pointcut="execution(* *..SubClass.*(..))"/>
</aop:config>

但是subAdvice当我通过调用getZero()方法时没有应用SubClass,可能是因为在SubClass. 当我重写该getZero()方法时它起作用了,但我不想重写它,因为实际上方法太多,SuperClass如果我想调用SuperClass's 方法是多余的。

我可以将建议应用于不实现方法的子类吗?或者有没有其他有选择地应用建议的好方法?

4

2 回答 2

1

你关于它的理论不起作用,因为你没有在你的子类中实现/覆盖它是正确的。您的切入点指定子类中定义的方法的所有执行,并且如果没有在类中实际定义的任何方法,您将没有任何匹配的连接点。

从您的问题中,我不确定您是要匹配所有子类的方法执行,还是只匹配在超类上定义但在子类实例上调用的那些。如果你问的是前者,你可能想使用这个切入点:

execution(* package.SuperClass+.*(..))

添加的加号选择了 SuperClass 的所有子类型,因此您的切入点现在选择 SuperClass 或其子类中定义的所有方法的所有执行。在此处查看 AspectJ 参考以获取有关子类型模式的更多信息。

于 2012-05-11T05:12:05.137 回答
0

我发现我的方法是错误的。bean我可以像这样使用 express对子类应用建议:

<bean id="subAdvice" class="package.SomeAdvice" />
<aop:config>
    <aop:advisor advice-ref="subAdvice" pointcut="bean(subClass)"/>
</aop:config>

但我不需要为此创建一个子类。我需要的只是一个应用其他建议的 bean。总之,我可以通过制作多个 bean 来应用多个建议,并通过 bean 名称有选择地选择建议。

于 2012-05-11T06:51:57.793 回答