我有两个实现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
的方法,这是多余的。
我可以将建议应用于不实现方法的子类吗?或者还有其他有选择性地应用建议的好方法吗?
答案 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名称选择性地选择建议。