2010-10-23 68 views
3

場景:春季:如何組織應用程序+網絡環境?

  1. 開始在main(應用程序和負載ClassPathXmlApplicationContext),這將啓動一個碼頭web應用。
  2. 調度的servlet然後加載再XmlWebApplicationContext
  3. 調度servlet尋找WEB-INF/applicaitonContext.xml爲根上下文

我只是試圖讓我的頭周圍的環境負荷。

  • 我應該使用3種上下文嗎?
  • 我應該使用第一個上下文作爲根上下文,並且不允許調度程序加載默認的WEB-INF/applicationContext
  • 我應該在第一個和第三個上下文之間創建父/子關係嗎? (這是我之間#2,#3上下文由調度員的servlet完成)

我只是不太清楚但有關這些情況下如何與彼此,我只是需要就可以了簡要總結。

回答

7

上下文#1根本沒有連接到其他上下文,它只是啓動Web服務器(Jetty)的實現細節。 在春季reference documentation中有些解釋了上下文#2和#3。

  • 上下文#2從WEB-INF/[servlet-name]-servlet.xml加載。由於可以有許多DispatcherServlet,因此對於不同的servlet,單個webapp中可能會有多個這樣的上下文。
  • 上下文#3通常從WEB-INF/applicationContext.xml加載,您必須採取特殊步驟才能加載(使用ContextLoaderListener)。此加載的上下文成爲特定Web應用程序中所有特定Servlet上下文的父上下文(共享)。因此,它適合加載業務服務bean和數據庫訪問bean。

您列出的設置完全正常。事實上,我將它稱爲推薦的設置,因爲它使事情變得簡單並且接近Spring典型web應用程序中的Spring上下文。

但是:

您可能擺脫環境#3,如果你不想讓你的業務豆單獨的上下文。但是,我建議您將它們分開(您可能需要稍後將它們移動到其他機器上,並通過某種遠程機制提供)。

擺脫環境的另一個原因#3:您可能想在多個webapps中共享您的業務bean。爲了達到這個目的,你需要一個Spring ContextLoader的特殊子類,然後在Jetty啓動你的webapps時做一些魔術。我已經這樣做了,如果需要,可以提供一些建議。

最後,你可能會擺脫上下文#1並取代舊的純Java代碼,將啓動碼頭。這個決定完全取決於你和喜好。爲了記錄,我還喜歡使用單獨的Spring應用程序上下文來引導Jetty。