JBoss.org Community Documentation
For annotated parameters typed around advices, there is a third rule, which is the return type. This rule also applies to after and finally advices. If the joinpoint has a non-void return type, the assignability degree of the advice return type is analyzed, pretty much in the same way we do with annotated parameters. So, for overloaded around advices, these three criteria are applied:
presence of annotated parameter
assignability degree of annotated parameter
assignability degree of return type
If two advices have the same ranking on the first two criteria, we check their return types and pick the advice with the lowest assignability degree:
public class POJO { public Collection method(int arg0, boolean arg1, short arg2) {…} } <aop> <aspect class="OneAspect"/> <bind pointcut="execution(* POJO->method(..))"> <advice aspect="OneAspect" name="around"/> </bind> </aop> public class OneAspect { public Collection around(@JoinPoint Invocation inv, @Arg int param0) throws Throwable {...} //1 public List around(@JoinPoint Invocation inv, @Arg boolean param1) throws Throwable {...} //2 }
In OneAspect above, we have two around advices. Both of them are equal when compared
using the presence criteria. When comparing them using the assignability of annotated
parameter, both of them have the same degrees on @JoinPoint
and on
@Arg
parameters. In this case, we will compare their return type
assignability degree.
Notice that, when it comes to return types, it is the return type that must be assignable
to the joinpoint type, and not the contrary. This is due to the fact that JBoss AOP will
assign the advice return value to the joinpoint return result in the base system. Hence,
in the example above, the caller of POJO.method()
expects a
Collection
return value. So, it is ok to receive either a
Collection
from the first advice, as the more specific type
List
from the second advice. But JBoss AOP will complain if your advice
returns an Object
(Object
return type is allowed only
in the default signature; here we are discussing the annotated-parameter signature), because
we can’t give an Object
to the base system when it is expecting a
Collection
.
So, in the above example, the first advice has an assignability degree of 0 on the return type,
becase it takes 0 steps in the hierarchy to go from Collection to Collection
.
In the second advice, this value is 1, because it takes 1 step to go from List
to Collection
. JBoss AOP would select the first advice.
On overloaded after and finally advices, we also have a return type rule. But, since the return type is optional (these advices can return a value, but is not enforced to it), we have a total of four rules for this advice:
presence of annotated parameter
assignability degree of annotated parameter
presence of non-void return type
assignability degree of return value type
The third rule, presence of non-void return type, states that JBoss AOP will give preference to an after advice that returns a value:
<aop> <aspect class="OneAspect"/> <bind pointcut="execution(* POJO->method(..))"> <after aspect="OneAspect" name="around"/> </bind> </aop> public class OneAspect { public Collection after(@Arg int param0) {...} //1 public List after(@Arg boolean param1) { ... } //2 public void after(@Arg short param2) { ... } //3 }
Considering the same POJO
class defined previously (with
public void method(int, boolean, short)
), all three overloade
versions of OneAspect.after()
advice wil be considered equivalent
in the first two criteria. Hence, we move to the third rule, that states that
JBoss AOP prefers an after advice that returns a value over another one that is
void
. So, in the example above, the third advice is ruled out,
and JBoss AOP still has two advices to select. Moving to the next rule, he assignability
degree of the return type, we have the same result as the
OneAspect.around()
advice: the first one has a 0 degree, and the second
one, a 1 degree value. As a conclusion of these degrees, JBoss AOP will select the first
advice, with the lowest return assignability degree.