If you have several classes that all are going to be intercepted in a similar way, you can declare a typedef to avoid declaring different pointcuts for each class. The typedef must resolve to a class expression.
<typedef name="TD" expr="(class(POJO) AND has(* *->method(..))) OR class($instanceof{ExecutionTypedefInterface}) OR class(@executionTypedef)" />
The typedef can then be used in place of the class name in pointcuts
<bind pointcut="execution($typedef{TD}->new())">
<interceptor class="SimpleInterceptor" />
</bind>
<bind pointcut="execution(* $typedef{TD}->method())">
<interceptor class="SimpleInterceptor" />
</bind>
<bind pointcut="field(* $typedef{TD}->field1)">
<interceptor class="SimpleInterceptor" />
</bind>
<bind pointcut="all($typedef{TD})">
<interceptor class="SimpleInterceptor2" />
</bind>
In the supplied example POJO is not annotated and does not implement ExecutionTypedefInterface. POJO2 implements ExecutionTypedefInterface, and POJO3 is annotated with @executionTypedef.
$ 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
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo.field1 = 10; ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- get pojo.field1;---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo.method(); ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] =======================
[java] --- new POJO2(); ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo2.field1 = 10; ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- get pojo2.field1; ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo2.method(); ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] =======================
[java] --- new POJO3(); ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo3.field1 = 10; ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- get pojo3.field1; ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
[java] --- pojo3.method(); ---
[java] <<< Entering SimpleInterceptor
[java] <<< Entering SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor2
[java] >>> Leaving SimpleInterceptor
POJO, POJO2 and POJO3 all get intercepted the same.