Aop has many uses, from doing transaction handling to authorisation. With the powerfull Guice framework it is suprisingly easy.
In this example we mark methods from a class with a Annotiation marker use Guice to intercept them.
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface InjectedTransaction { }
Now, we mark a method of some class with it:
public class BasicDummyService { @InjectedTransaction public void testService() { System.out.println("doing testService"); } }
Now, we need an Interceptor, which will be called as a proxy instead of the real service:
import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class AopInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("Interceptor: before"); Object o = invocation.proceed(); System.out.println("Interceptor: Done !"); return o; } }
Finally, we need to use Guice’s Module to configure the binding:
import com.google.inject.AbstractModule; import com.google.inject.matcher.Matchers; public class AopModule extends AbstractModule { @Override protected void configure() { bind(BasicDummyService.class); bindInterceptor(Matchers.any(),Matchers.annotatedWith(InjectedTransaction.class),new AopInterceptor()); } }
Thats it ! Now, when you call the testService() method from a guice injected class, you’ll get the following:
Injector injector = Guice.createInjector(new AopModule()); BasicDummyService test = injector.getInstance(BasicDummyService.class); test.testService(); Result: Interceptor: before doing testService Interceptor: Done !
The Guice Wiki also has a nice article about AOP with Guice.