【发布时间】:2011-05-12 19:28:33
【问题描述】:
我正在开发一个 Spring MVC Web 应用程序,它使用一个 Jetty HTTP 服务器,其中包含一个 WebAppContext
<bean id="Server" class="org.mortbay.jetty.Server" init-method="start"
destroy-method="stop">
<property name="connectors">
<list>
<bean id="Connector" class="org.mortbay.jetty.nio.SelectChannelConnector">
<property name="port" value="9531" />
</bean>
</list>
</property>
<property name="handler">
<bean id="handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<property name="handlers">
<list>
<bean id="contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection">
<property name="handlers">
<list>
<bean class="org.mortbay.jetty.webapp.WebAppContext">
<property name="contextPath" value="/" />
<property name="war" value="/etc/WebContent" />
<!-- <property name="copyWebDir" value="true" /> -->
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
</property>
</bean>
我试图找出应该在哪里定义 bean。基本上有两种选择:我的应用程序特定的 Spring 配置文件(称为“myApp-context.xml”)或 servlet Spring 配置文件(称为“myApp-servlet.xml”)。 web.xml 文件中的相关部分是:
<servlet-mapping>
<servlet-name>myApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:jeff/myApp-context.xml</param-value>
</context-param>
到目前为止,一切都很好。基于其他相关问题/答案,我将 Spring MVC 视图解析器(与 webapp 直接相关)等内容放入 myApp-servlet.xml,并将其他特定于应用程序的 bean(如 DAO、权利实用程序等)放入 myApp- context.xml(在 web.xml 中以“contextConfigLocation”的形式给出)。这工作正常,应用程序启动,一切都被正确注入,Spring MVC 控制器工作正常,等等。
不过,我注意到的是 myApp-servlet.xml 中定义的任何 bean(根据约定,鉴于我的 servlet 名称是“myApp”,它必须存在于 web 根目录中)由 Spring 加载两次。具体来说,有一条类似“Initializing Spring FrameworkServlet 'myApp'”的日志消息,之后会再次加载 myApp-servlet.xml 中的所有 bean。
如果我将所有这些 bean 从 myApp-servlet.xml 移动到 myApp-context.xml,将 myApp-servlet.xml 留空(只是打开和关闭标签),应用程序会成功启动(这次更快)并且不会每个 bean 创建两次。
然而,Jetty 的 WebAppContext 似乎坚持存在一个 myApp-servlet.xml 文件(如果不存在,应用程序将无法启动)。它还要求定义 contextConfigLocation 并指向有效的 Spring 配置文件。
谁能帮我整理一下我的配置?让 myApp-servlet.xml 没有任何 bean 定义感觉是正确的,因为应用程序启动得更快并且没有多余的 bean 初始化,但错误,因为 Web 应用程序上下文似乎要求它存在。将一些 bean 放入 myApp-servlet.xml 感觉是正确的,否则它会是空的,但错误的是因为现在这些 bean 被初始化了两次,启动需要更长的时间,而且无论如何选择放置哪些 bean 感觉很随意。感谢您的帮助,可以根据需要提供更多详细信息/sn-ps。
编辑:我现在很清楚这两者不同的原因。 myApp-servlet.xml 是一个特定于 servlet 的 Spring 配置文件。因此,如果该 servlet 是 Spring MVC servlet,则应将控制器等放在该文件中。也可以有 myApp2-servlet.xml 和 myApp3-servlet.xml,在同一个容器中定义另外两个 servlet。所有这些自然都会有彼此独立的bean(因为它们是完全独立的网络应用程序)。
另一方面,myApp-context.xml 文件包含将提供给 each servlet 的 bean 定义。这就是为什么数据库实用程序、权利等,正如 Neeme Praks 所指出的,应该放在那个文件中。很可能每个 Web 应用程序虽然在其呈现和功能上完全独立,但需要使用一些常用的实用程序。这是定义那些“通用”bean 的地方。
【问题讨论】:
标签: java spring web-applications spring-mvc jetty