2012-09-26 35 views
0

默認豆初始化策略被捕獲在此日誌:如何爲Spring Beans選擇不同的初始化策略?

[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.Instance> setBeanName() asda 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: create() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: start() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: create() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: start() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: stop() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: destroy() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: stop() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: destroy() 

豆其start()方法被調用後,被視爲完全初始化。現在我想要做的是同步初始化所有的bean。在每個其他bean完成其步驟之前,沒有bean會繼續進行下一個初始化步驟。生成的日誌將是這個樣子:

[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.Instance> setBeanName() asda 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: create() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: create() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsa, message: start() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread main, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: start() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: stop() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: stop() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsa, message: destroy() 
[Wed Sep 26 13:10:35 CEST 2012]: <Thread Thread-1, Class is.test.spring.ExecutableImpl> ID: fdsaa, message: destroy() 

我如何能做到這一點任何想法?

此外,是否有可能在後臺線程中處理所有初始化(每個bean的每個生命週期步驟)?我預計初始化將非常耗時...

+0

請參見:[SPR-8767 - 啓動過程中的並行Bean初始化](https://jira.springsource.org/browse/SPR-8767) –

+0

因此,沒有任何事情可以做到......我不是那麼'流利'在春天,但是我相信也許有定製LifecycleProcessor和BeanPostProcessor的控制PostConstruct和PreDestroy可以提供一個解決方案...雖然會有那麼多隻是爲了更好地在實現發掘的做一切:)另外我有種提出的兩個問題我想解決。現在不需要進行並行初始化,只有同步初始化纔是完全可以接受的。 – Kostas

回答

0

任何想法,我該如何實現這一目標?

您可以使用<bean depends-on="..."/>表示法或使用註釋org.springframework.context.annotation.DependsOn來管理Spring生命週期。

此外,將有可能來處理後臺線程所有初始化(每個bean的每一個生命週期步驟)?

在你的bean的init()或destroy()方法中(通過InitializingBean/DisposableBean或通過PostConstruct/PreDestroy),你可以創建一個不同的線程來初始化/銷燬它。

+1

DependsOn是對bean級別的依賴,而不是初始化步驟級別(如果我們可以這樣調用它)。另外我知道我可以自己運行線程,但是我會詢問Spring支持它的功能 – Kostas