You define precedence in a separate class annotated with @Precedence
import org.jboss.aop.Precedence; import org.jboss.aop.PrecedenceInterceptor; @Precedence public class Precedence1 { @PrecedenceInterceptor public static SimpleInterceptor precedenceInterceptor1; @PrecedenceInterceptor public static SimpleInterceptor2 precedenceInterceptor2; }
The @PrecedenceInterceptor is used to annotate fields where the type is an interceptor, and the orderings within the class define the relative sort order for the precedence. In other words this class defines that
SimpleInterceptor comes before SimpleInterceptor2
Precedence2 also defines a set of precedences:
@Precedence public class Precedence2 { @PrecedenceInterceptor public static SimpleInterceptor2 simple2; @PrecedenceAdvice ("advice") public static TestAspect advice; @PrecedenceInterceptor public static SimpleInterceptor3 simple3; @PrecedenceAdvice ("otherAdvice") public static TestAspect otherAdvice; }
The @PredenceAdvice is used to annotate fields where the type is an aspect. The attribute value in the @PrecedenceAdvice annotation is the name of the advice method in the aspect, so:
SimpleInterceptor2 comes before TestAspect.advice comes before SimpleInterceptor3 comes before TestAspect.otherAdvice
The precedence entries are merged into an overall precedence entry, so that:
SimpleInterceptor comes before SimpleInterceptor2 comes before TestAspect.advice comes before SimpleInterceptor3 comes before TestAspect.otherAdvice
$ antIt will javac the files and then run the AOPC precompiler to manipulate the bytecode, then finally run the example. The output should read as follows:
run: [java] --- new POJO(); --- [java] <<< Entering SimpleInterceptor type: POJO0OptimizedConstructorInvocation [java] <<< Entering SimpleInterceptor2 type: POJO0OptimizedConstructorInvocation [java] <<< Entering TestAspect.advice type:POJO0OptimizedConstructorInvocation@f6a746 [java] <<< Entering SimpleInterceptor3 type: POJO0OptimizedConstructorInvocation [java] <<< Entering TestAspect.otherAdvice type:POJO0OptimizedConstructorInvocation@f6a746 [java] empty constructor [java] <<< Leaving TestAspect.otherAdvice type:POJO0OptimizedConstructorInvocation@f6a746 [java] >>> Leaving SimpleInterceptor3 [java] <<< Leaving TestAspect.advice type:POJO0OptimizedConstructorInvocation@f6a746 [java] >>> Leaving SimpleInterceptor2 [java] >>> Leaving SimpleInterceptor