Introducción a los interceptores en Java EE
- Introducción a los Interceptores en Java EE
-
el paquete
javax.interceptor
en Java - el método interceptor en Java
- Uso de métodos de interceptor y clases de interceptor en Java
En este artículo, veremos una introducción a los interceptores en Java EE. Incluye métodos de interceptor, clases de interceptor e interceptores de devolución de llamada de ciclo de vida.
Introducción a los Interceptores en Java EE
En Java EE versión 5, podíamos usar interceptores solo en Enterprise JavaBeans (“EJB”). Si bien la versión 6 de Java EE trajo nuevas especificaciones, pudimos aplicarlas de manera más genérica porque se abstrajo en un nivel superior.
La versión 7 de Java EE introdujo la anotación @Transactional
, que permite transacciones gestionadas por contenedores fuera de Enterprise JavaBeans. Se define como el enlace del interceptor e implementado por el tiempo de ejecución de Java EE.
El interceptor es la clase cuyos métodos se invocan cuando se invoca un método comercial en el destino. Por ejemplo, ocurren eventos del ciclo de vida, como aquellos métodos que destruyen o crean un bean.
Usamos interceptores para implementar las preocupaciones transversales. Por ejemplo, seguridad, auditoría y registro desde la lógica empresarial.
Podemos definir interceptores como interceptores de clase o interceptores de método, y el enfoque preferido es usar anotaciones de metadatos para definir un interceptor. También podemos definirlos en un descriptor de aplicación, pero no serían portátiles entre servidores Java EE.
el paquete javax.interceptor
en Java
Las anotaciones de metadatos residen en el paquete javax.interceptor
. Algunos ejemplos de anotaciones de metadatos son @AroundTimeout
y @AroundInvoke
.
El paquete javax.interceptor
tiene todas las interfaces y anotaciones que usamos para definir las clases y métodos del interceptor y también se usa para vincular una clase de interceptor a la clase de destino. La funcionalidad de un interceptor se define en las especificaciones de Java Interceptor.
Las especificaciones de los interceptores definen dos tipos de puntos de intercepción: la intercepción de devolución de llamada del ciclo de vida y la intercepción de método comercial. La inyección de contexto y dependencia (CDI
) mejora esta funcionalidad y mejora con un enfoque semántico y basado en anotaciones para vincular los interceptores a beans.
el método interceptor en Java
Es un método de la clase objetivo o una clase interceptora. Invocado para interponerse en la invocación del método de la clase de destino, y también, en el evento del ciclo de vida y el constructor de la clase de destino, etc.
Para una clase objetivo, podemos declarar el método interceptor en la clase objetivo, la clase interceptora o en la superclase de la clase interceptora o la clase objetivo. El AroundConstruct
es el único método que podemos definir en la clase interceptor o su superclase.
El AroundInvoke
, AroundTimeout
, PostConstruct
y PreDestroy
también son los métodos interceptores. Mientras que PostConstruct
, AroundConstruct
y PreDestroy
se conocen colectivamente como métodos interceptores de devolución de llamada del ciclo de vida.
Clases de interceptor
La clase de interceptor es diferente de la clase de destino. Los métodos de la clase de interceptor se invocan en respuesta a invocaciones en una clase de destino, y una clase de destino puede asociarse con cualquier número de clases de interceptor.
Recuerde, la clase de interceptor debe contener un constructor público sin argumentos. Para una clase, usamos anotaciones de metadatos para definir clases y métodos de interceptor, y también podemos usar descriptores de implementación para definir clases/métodos de interceptor.
Las clases de interceptor se invocan en el orden en que se han definido en la anotación javax.interceptor.Interceptors
. Recuerde, este orden no es fijo y el descriptor de implementación puede anularlo.
Ciclo de vida del interceptor
El ciclo de vida de las clases de interceptor es el mismo que el de sus clases de destino asociadas. Cuando creamos una instancia de la clase de destino, también se instancia la clase de interceptor, y lo hacemos para cada clase de interceptor que declaramos en una clase de destino.
Instanciamos todas las clases de interceptor y objetivo antes de invocar las devoluciones de llamada @PostConstruct
. Además, destruya las instancias de la clase de destino del interceptor antes de invocar las devoluciones de llamada @PreDestroy
.
Uso de métodos de interceptor y clases de interceptor en Java
Solo necesitamos ponerlos alrededor de nuestro método de la siguiente manera para usar métodos de interceptor. Lo llamamos el interceptor del método de intercepción.
@AroundTimeout public void timeoutInterceptorMethod(InvocationContext ctx){...}...
Para las clases de interceptor, agregamos anotaciones de interceptor. Póngalos en nuestra clase de interceptor.
Vea el siguiente ejemplo.
Ejemplo:
@Stateless
public class OrderBean {
... @Interceptors(OrderInterceptor.class) public void placeOrder(Order order){...}...
}
Puede marcar esto para explorar los interceptores en detalle.