<prepare expr="all(POJO)"/>This expression simple states to prepare all constructor, method, and field access to be AOPable. Actually, any <pointcut> or <bind> expression will cause a Java class to be "prepared".
You can see this in action within Driver.java
System.out.println("--- adding instance interceptors ---");
Advised advised = (Advised)pojo;
advised._getInstanceAdvisor().insertInterceptor(new InstanceInterceptor());
Driver.java typecasts the pojo instance to Advised. From the Advised interface, the code gets access to the InstanceAdvisor API and inserts an interceptor.
AdviceBinding binding = new AdviceBinding("execution(POJO->new(..))", null);
binding.addInterceptor(SimpleInterceptor.class);
AspectManager.instance().addBinding(binding);
You can also remove bindings at runtime as well through the AspectManager class. See javadocs for more detail.
$ 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] in empty constructor
[java] --- adding instance interceptors ---
[java] --- pojo.counter++; ---
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.FieldReadInvocation
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.FieldWriteInvocation
[java] --- pojo.someMethod(); ---
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.MethodInvocation
[java] in someMethod
[java] --- new POJO(); ---
[java] <<< Entering Simplenterceptor for: org.jboss.aop.joinpoint.ConstructorInvocation
[java] in empty constructor
[java] --- adding instance interceptors ---
[java] --- pojo.counter++; ---
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.FieldReadInvocation
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.FieldWriteInvocation
[java] --- pojo.someMethod(); ---
[java] <<< Entering Instancenterceptor for: org.jboss.aop.joinpoint.MethodInvocation
[java] in someMethod