Tengo un método con una anotación @Produces que crea un archivo Apple .
Cuando lo uso con @ApplicationScoped así
public class AppleProducer { @ApplicationScoped @Produces public Apple createApple() { return new Apple(); } }entonces Apple se crea solo una vez para toda la aplicación.
Cuando lo uso con @RequestScoped así
public class AppleProducer { @RequestScoped @Produces public Apple createApple() { return new Apple(); } }luego se crea para cada solicitud.
Pero, ¿y si no especifico un alcance?
public class AppleProducer { @Produces public Apple createApple() { return new Apple(); } }¿Con qué frecuencia se creará Apple? Sospecho en cada acceso, ¿es correcto? ¿Hay documentación sobre esto?
Es @Dependiente .
De acuerdo con "2.4.4. Alcance predeterminado " de la especificación CDI (1.2) :
Cuando no se declara explícitamente ningún alcance anotando la clase de bean o el método o campo del productor, el alcance de un bean se establece por defecto.
El ámbito predeterminado para un bean que no declara explícitamente un ámbito depende de sus estereotipos declarados:
• Si el bean no declara ningún estereotipo con un ámbito predeterminado declarado, el ámbito predeterminado para el bean es @Dependent.
• Si todos los estereotipos declarados por el bean que tienen algún ámbito predeterminado declarado tienen el mismo ámbito predeterminado, entonces ese ámbito es el ámbito predeterminado para el frijol.
• Si hay dos estereotipos diferentes declarados por el bean que declaran diferentes ámbitos predeterminados, entonces no hay un ámbito predeterminado y el bean debe declarar explícitamente un ámbito. Si no declara explícitamente un ámbito, el contenedor detecta automáticamente el problema y lo trata como un error de definición.
Si un bean declara explícitamente un ámbito, se ignoran los ámbitos predeterminados declarados por estereotipos.
Como no define ningún Scope, su bean producido será @Dependent por defecto.
Significa que el ciclo de vida del bean producido será el ciclo de vida del bean en el que se inyecta (contiene @Inject ).
Así que si tienes el siguiente productor:
public class AppleProducer { @Produces public Apple createApple() { return new Apple(); } } Si inyecta una manzana en un @ApplicationScoped Pie Bean:
@ApplicationScoped public class Pie { @Inject private Apple apple; } Luego, el bean de Apple será @ApplicationScoped , por lo que se creará solo una vez.
Si Pie bean es @RequestScoped , Apple bean se creará en cada solicitud.