Spring:如何组织应用程序+ Web上下文?

时间:2010-10-23 11:37:11

标签: java spring spring-mvc

情景:

  1. 启动应用并在main()中加载ClassPathXmlApplicationContext,这将启动Jetty webapp。
  2. 调度程序servlet然后加载XmlWebApplicationContext
  3. 调度程序servlet然后查找要加载为根上下文的WEB-INF/applicaitonContext.xml
  4. 我只是想绕过上下文。

    • 我应该使用上面列出的3个上下文吗?
    • 我应该使用第一个上下文作为根上下文而不允许调度程序加载默认的WEB-INF/applicationContext吗?
    • 我应该在第一个和第三个上下文之间创建父/子关系吗? (这是由调度程序servlet在#2和#3上下文之间完成的)

    我还不太清楚这些情境如何相互关联,我只需要快速了解它。

1 个答案:

答案 0 :(得分: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。

您概述的设置完全正常。实际上,我将其称为推荐的设置,因为它使事情变得简单并且接近于在典型的webapp中构造Spring上下文的方式。

<强>然而

如果您不希望将业务bean保留在单独的上下文中,则可以摆脱上下文#3 。但是,我建议你将它们分开(你可能需要稍后将它们移到另一台机器上并通过某种远程机制提供)。

摆脱上下文#3 的另一个原因:您可能希望在多个Web应用程序之间共享您的业务bean。为了实现这一点,你需要一个特殊的Spring ContextLoader子类,然后在Jetty启动你的webapps时做一些魔术。我已经这样做了,如果需要可以提供一些建议。

最后,您可以摆脱上下文#1 ,并将其替换为引导Jetty的旧式纯Java代码。这个决定100%取决于您和偏好问题。为了记录,我还想使用一个单独的Spring applicationContext来引导Jetty。