2013-07-04 64 views
8

現在直接來到我的觀點,如何在春季初始化應用程序?

JSP我會盡我的應用程序等的初始化過程,

<%! public void jsp_init(){ 

     //Initialise the domain server to create protocol 
     //Create the logging file 
}%> 

我現在就把我以前的應用程序從重建到ServletsSpring 3.2

我該怎麼做Spring 3.2

我的一個colleague說我這樣做initialization with Constructor of the Spring Controller

因爲我已經在applicationContext.xml創建的豆爲controller class,我加載applicationContext.xml文件枝條ContextLoadListnerweb.xml

這是初始化的正確方法嗎?

怎麼樣ApplicationListener在春天?

哪個是初始化應用程序的最佳方式spring 3.2

希望我們的堆棧用戶能給出一個很好的解決方案。

回答

8

春天會做一個很好的爲您處理。如果你真的需要執行代碼(vs使用能自動配置的東西,比如Log4J),我會建議註冊一個InitializingBean並覆蓋afterPropertiesSet。然後,您可以將這個bean定義添加到applicationContext.xml文件:

<bean id="initializer" class="com.myproject.MyInitializer" /> 

其結果是,Spring將調用方法時,應用程序已經完全初始化。您也可以在註冊到應用程序上下文的bean上使用@PostConstruct批註,但不保證在調用該方法時應用程序的其餘部分將被初始化。如果你希望它在所有東西都被設置好的情況下運行,那麼Initializing Bean方法就是要走的路。我使用這個策略來啓動服務器套接字等,這需要獨立於Web請求生命週期運行。

+0

感謝您對答案的回覆。 http://stackoverflow.com/questions/8686507/how-to-add-a-hook-to-the-application-context-initialization-event –

+0

@KitePlayer這也可以。這取決於您是否需要通知多種類型的應用程序事件或者只是啓動。 –

+0

我需要做一些任務,只有一次在我的tomcat開始之後......對此最好的方法是什麼? –

0

你可以通過在@PostConstruct上添加一個bean並在spring中注入servlet-config來實現。看看代碼here和底部的其中一行。

<beans:bean id="PlayerImportDaoImpl" 
     class="com.footieview.app.importer.dao.PlayerImportDaoImpl" /> 

這將在啓動注入這個bean在這個bean的方法有註解@PostConstruct - 這意味着在啓動時調用此方法。

6

爲什麼你會自己初始化spring應用程序? Spring將自動爲您做到: 這是你如何知道你的服務器初始化春:

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

    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

期間deploymentand所有的bean被定義會有(取決於懶惰)來初始化會發生這種情況。 如果你真的想要做的事,一旦bean被初始化,使用之前再使用InitializingBean 例子是

如果配置正確
MyBean implements InitializingBean{ 
    afterPropertiesSet() { 

     //do here 
    } 

} 
+0

它可能不是初始化通過'ContextLoaderListener'的應用程序是一個好主意。最好是隻在需要上下文的地方通過'ContextLoaderListener'配置你的'DispatcherServlet'並委託特定的任務。 –

+0

爲什麼這是個壞主意? Spring框架本身帶有這個監聽器,並建議您使用它來加載它。 'DispatcherServlet'用於mvc,mvc小於框架本身的10%,如果我不想使用mvc,該怎麼辦? – Elbek

2

ContextLoaderListener是啓動Spring的啓動程序的一種啓動方式WebApplicationContextApplicationListener更多的是在java應用程序級本身,而不是在Web應用程序上下文中。

ContextLoaderListener如果它有多個DispatcherServlet或某些映射到不同服務的servlet/servlet過濾器,那麼它是一個用於應用上下文化的優秀標準工具。基本上,有這樣的應用程序的不同servlet的監聽器是很方便的,這樣你就可以擁有精細的上下文。

我不知道你正在建立的應用程序的性質,但我認爲你現在正在嘗試一些基本的東西。如果是這種情況,並且即使在你有更復雜的設置的情況下,最好在啓動時加載一個控制器來處理主要的初始化例程,包括你的上下文。您可以使用您的控制器與豆在web.xml是這樣的:

<servlet> 
    <servlet-name>your-servlet</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

這的servelt也可以被映射和調用當您閱讀某些URL模式 例如

@RequestMapping("/welcome")   
    public ModelAndView helloWorld() 

並在Web部署描述符,該位是就像你喜歡的Spring Security你的servlet映射到其他Spring服務:

<servlet-mapping> 
    <servlet-name>crunchify</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

所以你並不真正需要使用的構造一個控制器,您也不需要使用ContextLoaderListener或其他偵聽器進行簡單的初始化任務。不過,學習他們的用例很方便,因爲在擴展應用程序時您將需要它。

瞭解更多關於調度servlet的位置:

​​

+0

如果他不想使用mvc,但他想加載spring呢? – Elbek

+0

他說他已經做了一個控制器,並且很可能已經開始使用mvc了。 在此處查看此問題的更多詳細信息[鏈接](http://syntx.co/languages-frameworks/difference-between-loading-context-via-dispatcherservlet-and-contextloaderlistener/): 「這是最佳做法保持業務邏輯組件和數據訪問類(通常在ApplicationContext中定義的)等中間層服務以及控制器和視圖解析器(WebApplicationContext中每個分派器Servlet中定義的)等Web相關組件之間的明確分離。 「 –