2011-08-06 25 views
6

Dường như với tôi, rằng @ApplicationScoped các hạt được bắt đầu chỉ lần đầu tiên chúng được truy cập trong một trang sử dụng EL.JSF2 ApplicationScope bean instantiation time?

Khi tôi truy vấn ApplicationMap, hạt @ApplicationScoped có được tạo không?

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

Làm cách nào khác tôi có thể kích hoạt quá trình khởi tạo ứng dụng phạm vi đậu trước khi trang XHTML được tải?

Trả lời

9

Bạn có thể sử dụng eager=true trong tuyên bố @ManagedBean.

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

    // ... 

} 

Cách này sẽ được tự động xử lý khi khởi động webapp.

Thay vì đó, bạn cũng có thể sử dụng Application#evaluateExpressionGet() để lập trình đánh giá EL và do đó tự động tạo hạt nếu cần. Xem thêm ví dụ trên this answer.

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

Bạn cũng có thể chỉ cần tiêm nó làm @ManagedProperty của hạt nơi bạn cần.

@ManagedBean 
@RequestScoped 
public class Register { 

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

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

    // ... 
} 

JSF sẽ tự động tạo nó trước khi tiêm trong bean mẹ. Nó có sẵn trong tất cả các phương thức ngoài @PostConstruct.