2013-08-05 68 views
1

我正在使用jax-rs和spring編寫Web服務。我有一個Singleton類表示一個名爲「Datasource」的數據庫連接池。Java/Spring:如何在服務器啓動時表示對象

 Datasource datasource = Datasource.getInstance(); 
    Connection connection = datasource.getConnection(); 

此代碼運行,因此單是在第一個「查詢」創建的,但我想創建在服務器啓動時的單一實例。我該如何做到這一點?在我的web.xml中,我有

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/application.xml</param-value> 
</context-param> 

並在application.xml中我有

<bean name="myRoutes" class="com.package.myClass" /> 

難道我在這兒加上豆?

+0

DI框架如Spring背後的想法是*消除像'Datasource'這樣的單例。是否有一個原因,你不是在任何地方注入實例,而是手動調用'getInstance()'? –

+0

@TomG,可能只是我是這個框架的新成員,而且還沒有深入瞭解它。這是什麼樣子? –

+1

在你要使用'Datasource'的類中,你可以要求通過'@ Autowired'注入 - 例如'@Autowired public Foo(Datasource ds){...}'。如果您將一個'Datasource'實例作爲一個bean提供,那麼通過將其配置爲XML,它將在創建時提供給這些類。查看Spring文檔獲取更多背景信息。 –

回答

1

默認情況下,ApplicationContext實現急切地創建和配置所有的singleton bean作爲初始化過程的一部分。單例作用域是Spring中的默認作用域。

定義一個使用靜態工廠方法創建的bean時,可以使用class屬性指定包含靜態工廠方法的類和名爲factory-method的屬性,以指定工廠方法本身的名稱。

<bean 
    id="dataSource" 
    class="com.package.DataSource" 
    factory-method="getInstance" /> 
+0

太好了,謝謝,那就是我需要的! –

+0

對於新項目,我強烈推薦新的基於註釋的語法。在你的一個'@ Configuration'對象中,你只需要一個'@Bean public DataSource dataSource()'方法來返回正確構造的對象,並且Spring會把它提取出來並使之可用。 – chrylis

0

是的,根據這個定義,你在服務器啓動時創建單春豆:

<bean name="myRoutes" class="com.package.myClass" /> 
相關問題