2010-10-23 53 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。