2011-08-06 18 views
6

Me parece que los beans @ApplicationScoped se inician solo la primera vez que se accede a ellos en una página usando EL.JSF2 ApplicationScope tiempo de instanciación de frijol?

Cuando consulto el ApplicationMap, ¿se creará el bean @ApplicationScoped?

ExternalContext ec = currentInstance.getExternalContext(); result = 
    ec.getApplicationMap().get(beanName); 

Cómo más podría desencadenar la creación de instancias de la aplicación en el ámbito de frijol antes se ha cargado una página XHTML?

Respuesta

9

Puede usar eager=true en la declaración @ManagedBean.

@ManagedBean(eager=true) 
@ApplicationScoped 
public class Config { 

    // ... 

} 

De esta forma, el bean se autocrea en el arranque de la aplicación.

En lugar de eso, también puede usar Application#evaluateExpressionGet() para evaluar programáticamente EL y así crear automáticamente el bean si es necesario. Vea también el ejemplo en this answer.

FacesContext context = FacesContext.getCurrentInstance(); 
Confic config = (Config) context.getApplication().evaluateExpressionGet(context, "#{config}", Config.class); 
// ... 

También puedes, simplemente inyectarlo como @ManagedProperty del grano donde lo necesite.

@ManagedBean 
@RequestScoped 
public class Register { 

    @ManagedProperty("#{config}") 
    private Config config; 

    @PostConstruct 
    public void init() { 
     // ... 
    } 

    // ... 
} 

JSF lo auto-creará antes de inyectar en el bean padre. Está disponible en todos los métodos más allá de @PostConstruct.

Cuestiones relacionadas