2012-03-19 69 views
0

閱讀臨春2.5我有一個問題,發生了什麼事情在第90頁i列表4-19。爲什麼打電話preInstantiateSingletons()

他們展示了一個「ShutdownHook」的例子,他們在這裏創建一個bean工廠,然後調用factory.preInstantiateSingletons(),然後以正常的方式從工廠獲得bean。

默認情況下,Spring會根據需要實例化單例bean。這是一個問題 爲ShutdownHookBean,因爲它需要被實例化爲 註冊本身作爲關機掛鉤。調用 preInstantiateSingletons()會導致Spring遍歷其所有的單例bean定義並創建實例,調用任何回調方法作爲合適的。

我不明白。無論如何,當你打電話給getBean(...)時,是不是創建了這個bean?爲什麼需要調用preInstantiateSingletons()呢?

回答

2

問題是,您可能會創建從未直接引用的bean(如ShutdownHookBean)(即從未調用getBean()來強制實例化)。通過允許您強制初始化您可以確保調用

Runtime.getRuntime().addShutdownHook(myShutdownHookThread); 

調用是在myShutdownHookThread的代碼將在JVM關閉時調用。

我還沒有看到專業春書的代碼,但說你需要註冊一個關閉鉤子,調用一個由spring創建的服務。你決定做一個課,ShutdownHookBean

另外,假設你需要在關機代碼中參考MyService

你豆可能是這樣的:

public class ShutdownHookBean implements Runnable { 

    private final MyService service; 

    //MyService wired in by spring, (could be @Autowired etc). 
    public ShutdownHookBean(MyService service) { 

     this.service = service; 

     Runtime.getRuntime().addShutdownHook(this); 

    } 

    public void run() { 
      service.performShutdown(); 
    } 

}  

ShutdownHookBean被彈簧創建,只有當getBean()被調用,但因爲沒有其他bean需要引用它,從來都沒有來電getBean()。因此,您需要強制安裝ShutdownHookBean才能撥打電話addShutdownHook()

是彈簧想到另一種使用情況是,你可能希望強制豆初始化啓動,以驗證任何運行時配置和故障快,如果有

+0

你說的永遠不會直接引用意味着問題是什麼?你不需要獲得它的引用,以便將它作爲shutdownhook添加嗎? – LuckyLuke 2012-03-19 09:47:43

+0

@Viper - 我充實了這個例子 – sw1nn 2012-03-19 11:33:18

相關問題