2008-10-14 161 views
2

假設我有一對夫婦春豆:春天初始化順序

<beans> 
    <bean name="A" ... /> 
    <bean name="B" ... /> 
</beans> 

「B」暴露了一個遠程服務,它不需要「A」。假設「A」需要一個不可忽略的時間來加載。這意味着在重啓週期中,應用程序會掛起遠程客戶端,該遠程客戶端可以實際連接到服務器,但等待響應,直到spring容器完全初始化。

我想什麼,能夠做的是立即有「B」遠程服務響應,即使(基於應用程序的狀態),它只能返回NOT_READY或一些這樣的。但是,容器會強制等待,直到它的所有bean都被初始化,即使您將bean指定爲lazy-init並且與加載順序無關。

我懷疑是有「B」可立即將意味着春天將不得不作出可用部分初始化容器,這聽起來很糟糕。不過,我很感謝任何人獲得初始化順序的信息,以及您是否找到了任何合理的解決方法。

+0

你能解釋爲何bean中採用「不可忽略的時間」來實例化本身?是否可以重新分解Bean A,以便不可忽略的時間成爲在實例化過程之外調用的函數? – 2008-10-14 19:36:37

回答

3

不要直接引用bean「A」。相反,請參閱一個bean,它是豆類「A」的FACTORY;通過這種方式,可以創建Factory bean而不用實例化「A」的初始化命中。當然,您需要重構引用「A」的類以首先檢索「A」。

或者,你可以創建一個bean「AA」,這是豆「A」的容器,它有一個初始化狀態,其中暴露的bean的「A」的界面;在調用時,它將其初始化狀態設置爲未初始化,並開始在某個線程中初始化bean「A」;然後調用「AA」上的「A」的任何接口方法都可以阻止或返回未準備好的響應,直到「AA」內「A」的初始化完成。

這一切都有點取決於你的定義「需要一個不可忽略的時間來加載」是。爲什麼需要花費不可忽視的時間來加載? A中是否有一些特別棘手的初始化?或者是巨大的駭人聽聞的JVM?

0

我不明白,爲什麼「A需要一個不可忽略的時間加載」,但也許你可以懶惰通過重構來初始化自己。不要使用InitializingBean或處理ApplicationEvent。只需初始化第一個要處理的請求。這會減慢第一個請求!

另一種可能性是將初始化移動到由bean處理一個ApplicationEvent創建分離的線程。線程以異步的方式調用bean的初始化方法。請小心處理對未初始化的bean的請求!

+0

當加載時,調用者會掛起直到超時,因爲他們可以打開套接字但等待服務器初始化完成。想要手動加載服務以立即響應。我希望避免在手動啓動的後臺線程中初始化的混亂選擇。 – 2008-10-14 20:05:22