【问题标题】:Spring MVC with Jetty - what is supposed to go in the app-servlet.xml file?Spring MVC with Jetty - app-servlet.xml 文件中应该包含什么?
【发布时间】: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


    【解决方案1】:

    一般来说,您的设置是正确的:

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

    至于为什么你的 webapp 相关的 bean 被加载了两次 - 不知道。 它们不应加载两次。也许您阅读日志有误?也许有一些配置错误从您提供的配置 sn-ps 中不明显(完整的web.xmlmyApp-servlet.xmlmyApp-context.xml 会很有用)?

    另见:

    【讨论】:

    • 谢谢 - 我可以看到问题是我将 myApp-servlet.xml(连同 myApp-context.xml)作为 contextConfigLocation 属性的值包含在 web.xml 中。这显然会导致这些 bean 被加载两次。不幸的是,当我没有在 contextConfigLocation 中包含 myApp-servlet.xml 时,我遇到了不同的问题(Spring MVC 控制器无法接收请求),所以我需要再解决一些问题。
    猜你喜欢
    • 2019-11-09
    • 2011-08-18
    • 1970-01-01
    • 2016-11-26
    • 2021-05-17
    • 2011-05-06
    • 2010-12-29
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多