CDI is a part of the Java EE farmework which provides us with AOP.
This example is the same one with the spirng aop example post. I will display the behaviour of two beans with the same definition but each one has a different aspect, more specific they will use a different interceptor.
The Entered annotation would be our interceptor binding
package com.gkatzioura; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.interceptor.InterceptorBinding; @Inherited @InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface Entered { }
The employee interface will be used to create the beans for this project.
package com.gkatzioura; import javax.ejb.Local; import javax.ejb.Singleton; @Local public interface Employee { @Entered public void enterWorkArea(); }
We will have two different kind of advices.
The SupervisorBeforeAdvice
package com.gkatzioura; import java.io.Serializable; import java.util.logging.Logger; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; @Entered @Interceptor public class SupervisorBeforeAdvice implements Serializable{ private static final Logger LOGGER = Logger.getLogger(SupervisorBeforeAdvice.class.toString()); @AroundInvoke protected Object protocolInvocation(final InvocationContext invocationContext) throws Exception { if(invocationContext.getMethod().getName().equals("enterWorkArea")) { LOGGER.info("Check if everything is ok"); } return invocationContext.proceed(); } }
And the WorkerBeforeAdvice
package com.gkatzioura; import java.io.Serializable; import java.util.logging.Logger; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; @Entered @Interceptor public class WorkerBeforeAdvice implements Serializable { private static final Logger LOGGER = Logger.getLogger(WorkerBeforeAdvice.class.toString()); @AroundInvoke protected Object protocolInvocation(final InvocationContext invocationContext) throws Exception { if(invocationContext.getMethod().getName().equals("enterWorkArea")) { LOGGER.info("Informing the supervisor that I have arrived"); } return invocationContext.proceed(); } }
Two different beans will implement our employee interface.
Supervisor
package com.gkatzioura; import javax.ejb.Stateless; import javax.interceptor.Interceptors; @Stateless public class SupervisorEmployee implements Employee{ @Override @Interceptors(SupervisorBeforeAdvice.class) public void enterWorkArea() { } }
And worker
package com.gkatzioura; import javax.ejb.Stateless; import javax.interceptor.Interceptors; @Stateless public class WorkerEmployee implements Employee{ @Override @Interceptors(WorkerBeforeAdvice.class) public void enterWorkArea() { } }
I will use JAX-RS to cal those beans
Application configuration
package com.gkatzioura.jersey; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("rest") public class ApplicationConfig extends Application { }
And calling the two beans from different endpoints
package com.gkatzioura.jersey; import com.gkatzioura.Employee; import com.gkatzioura.SupervisorBeforeAdvice; import com.gkatzioura.WorkerBeforeAdvice; import javax.ejb.EJB; import javax.interceptor.Interceptors; import javax.ws.rs.GET; import javax.ws.rs.Path; @Path("/") public class AspectEndpoint { @EJB(beanName = "WorkerEmployee") Employee worker; @EJB(beanName = "SupervisorEmployee") Employee supervisor; @GET @Path("/worker/enter") public String workerEnter() { worker.enterWorkArea(); return "worker entered"; } @GET @Path("/supervisor/enter") public String supervisorEnter() { supervisor.enterWorkArea(); return "supervisor entered"; } }
One thought on “Aspect Oriented Programming: Java EE”