2011-08-06 14 views
6

Wydaje mi się, że fasole @ApplicationScoped są inicjowane tylko przy pierwszym dostępie do nich na stronie za pomocą EL.JSF2 Czas utworzenia komponentu bean ApplicationScope?

Kiedy wysyłam zapytanie do ApplicationMap, czy zostanie utworzony komponent bean @ApplicationScoped?

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

Jak inaczej mogę wywołać instancję komponentu o określonym zasięgu, zanim załadowana zostanie strona XHTML?

Odpowiedz

9

Możesz użyć w deklaracji @ManagedBean.

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

    // ... 

} 

W ten sposób komponent bean zostanie automatycznie utworzony podczas uruchamiania aplikacji Webapp.

Zamiast tego można również użyć funkcji Application#evaluateExpressionGet(), aby programowo ocenić EL i w razie potrzeby automatycznie utworzyć komponent bean. Zobacz także przykład na this answer.

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

Można też po prostu wstrzyknąć go jako @ManagedProperty fasoli, gdzie jest to potrzebne.

@ManagedBean 
@RequestScoped 
public class Register { 

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

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

    // ... 
} 

JSF automatycznie utworzy go przed wstrzyknięciem do komponentu rodzica. Jest dostępny we wszystkich metodach wykraczających poza @PostConstruct.

Powiązane problemy