2011-11-14 43 views
2

我有這種結構在我的Maven項目:

的jboss-作爲7類加載ManagedBean

WEB-INF/lib 
    - a.jar 
     - Registry.class (@ApplicationScoped, @ManagedBean(eager=true) 
    - b.jar 
     - Module.class (@ApplicationScoped, @ManagedBean(eager=true) 


我放在記錄在@PostConstruct註解的方法上在JBossAS7服務器上進行多次部署後,我發現有SEEMS在加載這些類時沒有特定的順序。我的意圖是始終在Module.class之前加載Registry.class。但是,這種類加載行爲,我不知道如何實現它。



在某些情況下,首先加載Registry.class,但在其他情況下,Module.class首先被加載,即使我剛剛重新啓動應用程序服務器並且沒有更改代碼

現在我的問題是,我能做些什麼來定義在WEB-INF/lib中加載jar的順序嗎?


不同的角度:

能也有可能,這個問題是不是類加載內,但與ApplicationScoped渴望ManagedBean?我加在a.jar文件類:

- RegistryTwo.class (@ApplicationScoped, @ManagedBean(eager=true) 


使a.jar文件現在包含Registry.class和RegistryTwo.class。有了這個,我希望是這樣的:

所需的輸出

Registry.class is invoked. 
RegistryTwo.class is invoked. 
Module.class is invoked. 

或(我將與此問題)

Module.class is invoked. 
Registry.class is invoked. 
RegistryTwo.class is invoked. 


在某些情況下,我得到這個:

RegistryTwo.class is invoked. 
Module.class is invoked. 

... (Other Processing logs.) 

Registry.class is invoked. 


根據@BalusC,一個ApplicationScoped渴望ManagedBean會自動實例化在應用程序啓動( How do I force an application-scoped bean to instantiate at application startup?),並在我的代碼出現這種情況。

我只是想知道:

  1. 如何JSF負載/創建ApplicationScoped渴望ManagedBeans?有什麼規則可以定義訂單嗎?
  2. 爲什麼Registry.class在RegistryTwo.class之前/之後沒有實例化,當它們都在同一個jar文件下時,它們都是ApplicationScoped?

回答

0

絕對沒有排序規則。

我建議讓Registry代替ServletContextListenerServletContainerInitializer。兩者都保證在JSF應用程序作用域bean構造之前運行。

ServletContextListener情況下,你可以讓Registry把自己的應用範圍如下:

@Override 
public void contextInitialized(ServletContextEvent event) { 
    event.getServletContext().setAttribute("registry", this); 
} 

這將在JSF提供/ EL由#{registry}通常的方式。