JBoss.org Community Documentation
The assignability degree rule will select the advice with the lowest assignability degree on the highest priority parameter. The assignability degree is simply the distance in the class hierarchy between the parameter type, and the type it must be assignable from.
As an example, let us look at the following class hierarchy:
public interface POJOInterface{} public class POJOSuperClass extends java.lang.Object{} public class POJO extends POJOSuperClass implements POJOInterface { void method(){} }
And this advice binding:
<aop> <aspect class="OneAspect"/> <bind pointcut="execution(* POJO->method(..))"> <before aspect="OneAspect" name="before"/> </bind> </aop> public class OneAspect { public void before(@Target POJO target){} //1 public void before(@Target POJOInterface target){} //2 public void before(@Target POJOSuperClass target){} //3 public void before(@Target Object target){} //4 }
With POJO
as the target of a joinpoint, the parameter list fo
the first OneAspect.before()
advice method has an assignability degree
0 on @Target
.
The parameter lists for the second and third OneAspect.before()
advice
methods both have an assignability degree of 1 for @Target
, since it takes
one step through the hierarchy to reach the desired type, POJO
.
Finally, the parameter list for the fourth OneAspect.before()
advice method
has an assignability degree of 2 on @Target
.
Hence, JBoss AOP will select the first advice in the example above, since it has the lowest
asignability degree on @Target
.
The assignability degree rule is, similarly to the presence rule, applied on the highest priority
annotated parameter, which is @JoinPoint
. In case there is a match using this
criteria (i.e., either both advices lack a @JoinPoint
annotated parameter, or
they both have the same type on the @JoinPoint
parameter), we move to the next
highest priority annotated parameter, which is @Target
. The same rule is applied
until we can find an advice with the highest priority.
Notice that the assignability degree of an advice on @Arg
is the sum of the
assignability degree on all @Arg
parameters. In the following scenario:
public class POJO { public void method(POJO argument0, String argument1, int argument2) } <aop> <aspect class="OneAspect"/> <bind pointcut="execution(* POJO->method(..))"> <before aspect="OneAspect" name="before"/> </bind> </aop> public class OneAspect { public void before(@Arg POJO p, @Arg String s, @Arg int i){} //1 public void before(@Arg POJOSuperClass p, @Arg String s, @Arg int i){} //2 public void before(@Arg POJO p, @Arg Object s, @Arg int i){} //3 public void before(@Arg Object p, @Arg Object s, @Arg int i){} //4 }
The first advice has assignability degree of 0 (for POJO
) + 0
(for String
) + 0 (for int
). Notice how primitive
types don’t have superclasses, and, hence, have always a 0 value of assinability degree.
The second advice has a larger assignability degree, since POJOSuperClass
is
the superclass of POJO
, @Arg POJOSuperClass p
has
assignability degree of 1. Hence, this advice assignability degree on @Arg
is:
1 + 0 + 0 = 1.
The third one also has an assignability degree of 1, since Object
is the superclass
of String
.
Finally, the last advice has assignability degree of 3 on @Arg
. The first parameter,
@Arg Object p
, refers to POJO
and has assignability degree of 2.
The second one, assignability degree of 1, since it refers to String
. And, since
@Arg int
refers to the int
argument of POJO.method()
,
we have 2 + 1 + 0 = 3.
In the above example, JBoss AOP would select the first advice to intercept POJO.method()
execution.