JBoss.org Community Documentation
For the default around advice signature (i.e., without annotated parameters), there is only one parameter to analyze, the invocation. So, the priority rules are very simple:
presence of the invocation parameter
assignability degree of the invocation parameter.
Lets revisit the example given in the beginning of this section, in augmented version:
class POJO { public int field; public POJO(){} public someMethod(){} } public class OneAspect { public Object trace(MethodInvocation invocation) throws Throwable {...} //1 public Object trace(ConstructorInvocation invocation) throws Throwable {...} //2 public Object trace(Invocation invocation) throws Throwable {...} //3 public Object trace() throws Throwable {...} //4 } <aop> <aspect class="OneAspect"/> <bind pointcut="all(POJO)"> <advice aspect="OneAspect" name="trace"/> </bind> </aop>
The fourth advice above will never be called, considering the presence rule. It is the only
one that lacks the Invocation
parameter, and would be called only if all
others were considered invalid in a scenario, which won’t happen in this example. By ruling
out this advice with the presence rule, all other advices are equivalent: the invocation parameter
is present in all of them. So, we need to move on to the assignability degree rule to select
one of them. However, the assignability degree needs to be calculated accordingly to the joinpoint
being intercepted. JBoss AOP needs to evaluate each joinpoint type to be intercepted to do the
correct selection for each case.
Consider the interception of the constructor of POJO
. In that case, the first advice
is considered invalid, becase a MethodInvocation
is not assignable from the invocation
type that JBoss AOP will provide, ConstrucorInvocation
. We are now left with the second
and third advices. The second one has assignability degree of 0 on the invocation type. The third one,
assignability degree of 1 (it takes one step in the hierarchy to go fom ConstructorInvocation
to Invocation
). So, in this case, JBoss AOP will select the second advice, because it
is the valid advice with the lower assignability degree on the invocation.
Similary, to intercept the execution of POJO.someMethod()
, JBoss AOP will consider the second
advice invalid, because it is supposed to receive an invocation whose type is assignable from
MethodInvocation
. Since the first advice has an assignability degree of 0 on the
invocation, and the third one, assignability degree of 1, JBoss AOP will select the first one.
Given that Invocation
will always be the super class of the expected invocation type,
JBoss AOP will select this advice, whose assignability degree will always be 1, only when the other two
advices are invalid. That would be the case of a field read, where the invocation type is
FieldReadInvocation
.