que español bean applicationscoped dependency-injection cdi java-ee-7

dependency-injection - bean - cdi java español



Significado del modo de descubrimiento de frijol anotado en CDI 1.1 (3)

Estoy migrando una aplicación a Java EE 7 y me gustaría CDI 1.1. Pero no entiendo el significado de bean-discovery-mode="annotated" . La especificación CDI 1.1 no es muy útil. Al menos no he encontrado ningún párrafo útil. ¿Me lo perdí?

Este ejemplo se ejecuta perfectamente con bean-discovery-mode="all" e inyecta una instancia de LoggingClass :

public class LoggingClass { public Logger logger = Logger.getLogger("ALOGGER"); } @Test public class MMLoggerProducerIT extends Arquillian { @Inject private LoggingClass lc; }

Pero si cambio de bean-discovery-mode="all" a bean-discovery-mode="annotated" el contenedor no puede inyectar una instancia en el campo lc .

¿Cómo debo anotar LoggingClass para usar bean-discovery-mode="annotated" correctamente?


Como cuestión práctica, bean-discovery-mode="ALL" activa el análisis de todas las clases en un archivo. Esto se llama un "archivo explícito".

beans.xml , o establecer bean-discovery-mode="ANNOTATED" , hace que el archivo sea un archivo implícito. En este caso, el contenedor buscará beans con tipos de alcance anotados.

Esto explica por qué LoggingClass no se inyecta cuando configura bean-discovery-mode="ANNOTATED" . Como se documenta en el Tutorial de Java EE 7:

CDI solo puede administrar e inyectar beans anotados con un tipo de alcance en un archivo implícito.

Edición: para que sea absolutamente claro, debe agregar un tipo de ámbito a LoggingClass . Así que algo como esto:

@SessionScoped public class LoggingClass { public Logger logger = Logger.getLogger("ALOGGER"); }

En Java EE 7 y CDI 1.1, eliminamos el requisito de incluir el beans.xml implementación beans.xml para activar CDI para un archivo, lo que hace que CDI 1.1 esté en línea con la mayoría de las otras API de Java EE donde los descriptores de implementación son opcionales. También eliminó la naturaleza binaria de encendido / apagado de incluir beans.xml o no. Puede controlar qué archivos son escaneados por el contenedor con la configuración en el bean-discovery-mode .

Consulte el tutorial de JavaEE sobre cómo empaquetar aplicaciones CDI aquí: http://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm#CACDCFDE


Cuando se usa bean-discovery-mode="annotated" solo se descubren las clases con una anotación que define el bean . Todas las otras clases son ignoradas. Cualquier tipo de ámbito es un bean que define la anotación. Si se declara un tipo de alcance en una clase de bean, se dice que la clase de bean tiene una anotación que define el bean [espec.] La especificación 1.1 no está completamente clara aquí. Solo se descubren las clases con un alcance @NormalScope o @Dependent pseudo alcance @javax.inject.Singleton , se @javax.inject.Singleton y todos los demás @Scope (pseudo).

Tenga en cuenta que la definición de una "anotación de definición de bean" cambió en CDI 1.2 y ahora está muy bien definida:

El conjunto de anotaciones que definen el bean contiene:

  • Anotaciones @ApplicationScoped, @SessionScoped, @ConversationScoped y @RequestScoped,
  • todos los demás tipos de alcance normal,
  • @Interceptor y @Decorator anotaciones,
  • todas las anotaciones de estereotipos (es decir, anotaciones anotadas con @Stereotype) y la anotación de alcance @Dependent.

También estoy de acuerdo con la forma de respuesta @rmuller. Pero quiero señalar que todavía hay un comportamiento diferente en los servidores de aplicaciones Payara y Wildfly. Vea el siguiente ejemplo con una clase normal sin ámbito pero con una inyección de @EJB:

public class SomeClass { @EJB MyService myService; ... }

Si proporciona un archivo beans.xml con:

.... version="1.2" bean-discovery-mode="annotated"....

Payara 4.1 tratará la clase SomeClass NOT como un bean CDI y NO inyectará el EJB de servicio. Esto me queda claro que se comporta como se indica en la especificación.

Pero Wildfly 10 trata la clase como un bean CDI e inyecta el servicio EJB que no se espera. Para que esto funcione, el archivo beans.xml debería tener este aspecto:

.... version="1.2" bean-discovery-mode="all"....

Es sorprendente que los dos servidores de aplicaciones más comunes sean diferentes aquí en su comportamiento.