gpt4 book ai didi

java - 带有 Jetty 的 Spring MVC - app-servlet.xml 文件中应该包含什么?

转载 作者:行者123 更新时间:2023-11-30 11:56:46 24 4
gpt4 key购买 nike

我正在开发一个 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 View 解析器(与 webapp 直接相关)之类的东西放入 myApp-servlet.xml,并将其他特定于应用程序的 bean(如 DAO、权利实用程序等)放入 myApp- context.xml(在 web.xml 中作为“contextConfigLocation”给出)。这工作正常,应用程序启动并正确注入(inject)所有内容,Spring MVC Controller 工作正常,等等。

不过,我注意到,在 myApp-servlet.xml 中定义的任何 beans(根据惯例,鉴于我的 servlet 名称是“myApp”,它必须存在于 Web 根目录中)由 Spring 加载两次。具体来说,有一条日志消息,如“正在初始化 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 放在那里感觉是随意的。感谢您的帮助,可以根据需要提供更多详细信息/片段。

编辑:我现在很清楚这两者不同的原因。 myApp-servlet.xml 是特定于 servlet 的 Spring 配置文件。因此,如果该 servlet 是 Spring MVC servlet,则应将 Controller 等放在该文件中。还可以有 myApp2-servlet.xml 和 myApp3-servlet.xml,在同一个容器中定义另外两个 servlet。所有这些自然都会拥有彼此独立的 bean(因为它们是完全独立的网络应用程序)。

另一方面,myApp-context.xml 文件包含将提供给每个 servlet 的bean 定义。这就是 Neeme Praks 指出的数据库实用程序、权利等应该放在该文件中的原因。很可能每个 Web 应用程序虽然在其呈现和功能上是完全独立的,但都需要使用一些通用的实用程序。这是定义那些“通用”bean 的地方。

最佳答案

一般来说,你有一个正确的设置:

  • myApp-servlet.xml 应该直接包含与 webapp 相关的 beans
  • myApp-context.xml 应包含业务逻辑 bean(例如 DAO、权利实用程序)

至于原因,为什么你的 webapp 相关的 beans 被加载了两次 - 不知道。 它们不应加载两次。也许您错误地阅读了日志?可能存在一些配置错误,从您提供的配置片段(完整的 web.xmlmyApp-servlet.xmlmyApp-context.xml 会有用)?

另见:

关于java - 带有 Jetty 的 Spring MVC - app-servlet.xml 文件中应该包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com