example - java predestroy
¿Cuál es la diferencia entre los ámbitos @ApplicationScoped y @Singleton en CDI? (6)
En CDI está el @ApplicationScoped
y el pseudo-scope ( javax.inject
) @Singleton
. ¿Cuál es la diferencia entre ellos? Además del hecho de que @ApplicationScoped
está @ApplicationScoped
, y @Singleton
no lo está.
¿Puedo simplemente cambiar mi @Singleton
bean a @ApplicationScoped
? ¿Puede @ApplicationScoped
bean tener dos (o más) instancias?
Hay una diferencia más: @Singleton
no es una anotación que define bean, ya que el alcance de Singleton
no es un alcance normal. Entonces @ApplicationScoped
es bean definiendo anotaciones.
Con la especificación CDI 1.1: cuando la aplicación en modo-descubrimiento = anotada, Weld no identifica los beans con @Singleton
y no carga esto
Por lo general, cuando desea tener solo una instancia de algún objeto, probablemente deba utilizar la anotación @ApplicationScoped
: dicho objeto se @ApplicationScoped
proxy y, por lo tanto, se puede serializar correctamente desde el primer momento.
Por otro lado, también hay muchos casos en los que solo desea una instancia de la clase, pero dicha clase no puede ser representada (por ejemplo, por ser definitiva), entonces @Singleton
es un rescate. Porque Singleton
es un pseudo-scope y no está siendo procesado como cualquier ámbito "normal".
Una de las principales diferencias con las que puede escribir su clase con un contratista predeterminado es tener un modificador de acceso privado cuando usa javax.inject.Singleton
, pero su clase debe tener un contratista predeterminado con al menos un modificador de acceso predeterminado cuando use javax.enterprise.context.ApplicationScoped
y esto es la implementación JBOSS 6.1 GA Final
@Singleton
en JSR-299 se refiere a los beans de sesión de Singleton ( javax.ejb.Singleton
, no javax.inject.Singleton
), no a los beans administrados JSR-299 en un alcance integrado llamado Singleton.
Puede encontrar en su servidor que @ApplicationScoped
es one-per EAR o one-per WAR / EJB-JAR, ya que no está claro en la especificación, pero definitivamente no debe esperar que sea uno por JVM.
@Singleton
no es parte de la especificación CDI. Es parte de EJB y javax.inject
(JSR-330). No se menciona en la especificación cuál es su comportamiento, por lo que solo puede confiar en lo que está escrito en la documentación de Weld.
en resumen: incluso puedes mezclarlo ( @Singleton
y @ApplicationScoped
) y tiene sentido en algunos escenarios. (¡y funciona como se espera en el mío!)
Además de las otras respuestas hasta ahora, me gustaría agregar algunos puntos más para aclarar en escenarios del mundo real.
Para mí, esta pregunta se desarrolló a partir de ¿Cómo obligo a un bean con ámbito de aplicación a crear instancias al inicio de la aplicación? En alguna discusión, dije esto y no puedo encontrar un argumento válido en contra de él hasta el momento:
En muchos escenarios / configuraciones de la vida real, diría que es difícil decir, desde un punto de vista abstracto / de modelado, si algo es (o será / será tratado como) un EJB o un bean gestionado con un ámbito de aplicación.
(discutibles pero no concluyentes) argumentos (desde mi punto de vista) en contra de ella hasta el momento: (@BalusC y todos los demás: me gustaría verlos concluyentes, pero si no, lo anterior puede ser cierto y, sin embargo, los argumentos pueden aún ayuda al lector a obtener las diferencias / ventajas / desventajas / malas / buenas prácticas)
EJB vs. Managed Bean
BalusC : Eso es un EJB, no un frijol administrado, que es bastante diferente. Los EJB se ejecutan en el back-end y los beans gestionados en el frontend. Los EJB también se ejecutan en contexto transaccional. [...] Acabas de confundir enterprise beans con beans administrados y yo solo lo señalé.
pero:
yo : creo que no eres del todo correcto y exagero el significado / uso y parece discutible para mí. http://en.wikipedia.org/wiki/Enterprise_JavaBeans
Enterprise JavaBeans (EJB) es un software de servidor gestionado para la construcción modular de software empresarial y una de varias API de Java. EJB es un componente de software del lado del servidor que encapsula la lógica comercial de una aplicación.
Tipos de Enterprise Beans
Session Beans [3] que puede ser "Stateful", "Stateless" o "Singleton" [...]
Mensaje impulsado frijoles [...]
... que sigue siendo cierto en mi caso.
Singleton EJB vs. Application Scoped Bean
Cierre
BalusC : Un EJB singleton no es lo mismo que un bean con ámbito de aplicación. Un EJB único es de lectura / escritura bloqueado y, por lo tanto, potencialmente ineficaz / sobreconvolucionado para la tarea que tenía en mente. Para resumir: tome un buen libro de Java EE y aprenda a usar la herramienta adecuada para el trabajo. Una forma definitivamente no es a la inversa. Que funcione no significa que sea la herramienta correcta. Un mazo es capaz de apretar un tornillo, pero no es necesariamente la herramienta adecuada para eso :)
pero:
(No puedo ver el mazo aquí, lo siento ...) Es bueno saber los valores predeterminados de bloqueo (no lo sabía), pero esto parece ser incorrecto de nuevo: Tutorial de Oracle Java EE 6 sobre la gestión del acceso concurrente en un Singleton Session Bean
Al crear un bean de sesión singleton, el acceso concurrente a los métodos comerciales de singleton se puede controlar de dos maneras: concurrencia administrada por contenedor y concurrencia manejada por bean. [...]
Aunque de forma predeterminada, los singleton utilizan concurrencia administrada por contenedor, la anotación @ConcurrencyManagement (CONTAINER) se puede agregar en el nivel de clase del singleton para establecer explícitamente el tipo de administración de concurrencia