Spring AOP:选择性地选择建议

时间:2012-05-11 01:53:50

标签: java spring aop spring-aop

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

我认为这是不可能的,所以我创建了一个目标类的子类,并为子类使用了pointcut express。

类看起来像:

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的方法,这是多余的。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我发现我的做法是错的。我可以将bean表达的子类的建议应用于这样:

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

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