SeamFramework.orgCommunity Documentation
Hemos visto cómo el modelo de inyección de dependencia de Web Beans nos permite omitir la implementación de un API en el momento del despliegue. Por ejemplo, la siguiente Web Bean empresarial provee una implementación del Procesador de Pago
de API en producción:
@CreditCard @Stateless
public class CreditCardPaymentProcessor
implements PaymentProcessor {
...
}
Pero en nuestro entorno, omitimos esa implementación de PaymentProcessor
con un Web Bean diferente:
@CreditCard @Stateless @Staging
public class StagingCreditCardPaymentProcessor
implements PaymentProcessor {
...
}
Lo que hemos tratado de hacer con StagingCreditCardPaymentProcessor
es remplazar totalmente a AsyncPaymentProcessor
en un despliegue particular del sistema. En ese despliegue, el tipo de despliegue @Staging
tendría una prioridad más alta que el tipo de despliegue predeterminado @Production
, y por ende los clientes con el siguiente punto de inyección:
@CreditCard PaymentProcessor ccpp
Recibirían una instancia de StagingCreditCardPaymentProcessor
.
Lamentablemente, hay varias trampas en las que se puede caer fácilmente:
el Web Bean de prioridad más alta puede que no implemente todos los tipos de API del Web Bean que intenta omitir,
el Web Bean de prioridad más alta puede que no declare todos los tipos de enlace del Web Bean que intenta omitir,
el Web Bean de prioridad más alta puede que no tenga el mismo nombre que el Web Bean que intenta omitir, o
el Web Bean que intenta omitir podría declarar un método de productor, método desechable o método de observador.
En cada uno de estos casos, el Web Bean que hemos tratado de omitir se podría llamar aún en el tiempo de ejecución. Por lo tanto, la omisión de alguna manera tiende a desarrollar error.
Web Beans ofrece una función especial, llamada Specialization, la cual ayuda al desarrollador a evitar estas trampas. Specialization parece un poco esotérica al comienzo, pero es fácil de utilizar en la práctica y realmente apreciará la seguridad adicional que proporciona.
Specialization es una función específica para Web Beans sencillos y empresariales. Para hacer uso de Specialization, la Web Bean de prioridad más alta debe:
ser una subclase directa del Web Bean que omite y
ser un Web Bean sencillo si el Web Bean que omite es un Web Bean sencillo o un Web Bean empresarial si el Web Bean que omite es un Web Bean empresarial y
estar anotado @Specializes
.
@Stateless @Staging @Specializes
public class StagingCreditCardPaymentProcessor
extends CreditCardPaymentProcessor {
...
}
Decimos que el Web Bean de prioridad más altaespecializa su superclase.
Cuando se utiliza Specialization:
los tipos de enlace de la superclase son heredados automáticamente por el Web Bean anotado @Specializes
, y
el nombre de Web Bean de la superclase es heredado automáticamente por el Web Bean anotado @Specializes
, y
los métodos de productor, métodos desechables y métodos de observador declarados por la superclase son llamados por una instancia del Web Bean anotado @Specializes
.
En nuestro ejemplo, el tipo de enlace @CreditCard
de CreditCardPaymentProcessor
es heredado por StagingCreditCardPaymentProcessor
.
Además, el administrador de Web Bean confirmará que:
todos los tipos de API de la superclase son tipos de API del Web Bean anotado @Specializes
(todas las interfaces locales del bean empresarial de superclase también son interfaces locales de la subclase),
el tipo de despliegue del Web Bean anotado @Specializes
tiene una prioridad más alta que el tipo de despliegue de la superclase, y
no hay ningún otro Web Bean habilitado que también especialice la superclase.
Si se violan algunas condiciones, el administrador de Web Bean produce una excepción en el momento de la inicialización.
Por lo tanto, podemos estar seguros que la superclase nunca será llamada en ningún despliegue del sistema donde el Web Bean anotado @Specializes
esté desplegado y habilitado.