Spring Application Context Load Order

时间:2010-11-22 08:50:43

标签: java spring spring-mvc web.xml

在我的web.xml上,我有一个“springmvc”servlet声明(它有一个相应的springmvc-servlet.xml)

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

我也有我常用的applicationContext.xml文件。

首先加载哪一个? springmvc-servlet.xml或applicationContext.xml?

我问这个的原因是每当我将<mvc:annotation-driven/>元素放在applicationContext.xml中时,我都会遇到严重上下文错误。但是当我将该元素放在springmvc-servlet.xml中时,我的Web应用程序运行正常。

任何想法为什么?

在另一个网络应用程序中,我在applicationContext.xml中有<mvc:annotation-driven/>,它运行正常。

附录: 我注意到 aop:config 的存在与 mvc:annotation-driven

发生冲突

4 个答案:

答案 0 :(得分:5)

applicationContext.xml上下文是dispatcher-servlet.xml上下文的父级。我不知道这是否意味着它首先被加载,但在你的情况下并不重要:

<mvc:annotation-driven />必须位于dispatcher-servlet.xml,因为它属于应用程序的网络部分。

答案 1 :(得分:3)

我解决了我的问题!

事实证明它与加载顺序或声明<mvc:annotation-driven/>的位置无关。

我尝试在另一台Tomcat上部署我的网络应用程序,令我惊讶的是,localhost日志中有一个堆栈跟踪。我通过反复试验暗示冲突是<aop:config/>。但是什么特别的冲突?

然后我在日志文件中看到了这个错误:

java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType

所以我们有一个强制转换异常。我用Google搜索了上面的确切错误并找到了这个:Spring 3: adding causes ClassCastException

看起来线程启动器和我有完全相同的问题。所以我下载了aspectj-1.6.10.jar,但我仍然缺少一个课程。然后事实证明它应该是 aspectjweaver-1.6.9

我还在使用一个非常古老的aspectjweaver。它的名字上没有任何版本。问题解决了。案件结案。

作为奖励,我手动将<mvc:annotation-driven/>元素展开到其等效的xml声明中:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
        </list>
    </property>
</bean>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

根据我研究的内容声明<mvc:annotation-driven/>时,它们完全相同。

感谢所有帮助过我的人。

答案 2 :(得分:0)

除了web.xml,没有预定义的顺序。 发生这种情况:

  • web.xml由servlet引擎加载,这会触发所有已定义的servlet,过滤器,监听器的加载,
  • ContextLoaderListener加载 根应用程序上下文XML,这个 可能包含a的bean定义 LocalSessionFactoryBean,触发 所有Hibernate映射XML的加载 文件
  • DispatcherServlet加载Web 应用程序上下文XML

研究web.xml以确定每种情况下的顺序。

另见:

link

答案 3 :(得分:0)

您可能必须将mvc名称空间添加到应用程序上下文中:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
>

(剥离其他名称空间)