Spring MVC:为什么这个<mvc:interceptors>声明工作,而不是传统的XML?</mvc:interceptors>

时间:2011-04-28 22:15:59

标签: java spring spring-mvc dependency-injection

我正在尝试向Spring MVC中的所有控制器/操作添加一些HandlerInterceptorAdaptor。我将这些添加到我的servlet XML文件中。

我不明白,为什么我下面的<mvc:interceptors>块正在工作,而不是DefaultAnnotationHandlerMapping的传统bean声明。

以下是正在运行的XML:

<mvc:interceptors>
    <bean name="interceptor1" class="com.foo.bar" />
    <bean name="interceptor2" class="com.foo.bar2" />
</mvc:interceptors>



这是我无法工作的XML:

<bean name="interceptor1" class="com.foo.bar" />
<bean name="interceptor2" class="com.foo.bar2" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
    <property name="interceptors">
        <list>
            <ref bean="interceptor1"/>
            <ref bean="interceptor2"/>
        </list>
    </property>
</bean>

我认为Spring会自动获取DefaultAnnotationHandlerMapping类型的bean,但情况似乎并非如此。

请注意,我使用@Controller注释所有Controller类,并使用@RequestMapping注释Controller中的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

Spring实际上为每个bean构建了一个“MappedInterceptor”(org.springframework.web.servlet.handler.MappedInterceptor)。

当我想了解Spring NamespaceHandler时,我发现查看源代码(对于NamespaceHandler,然后是BeanDefinitionParser)至关重要。

MvcNamespaceHandler向我指出了这个InterceptorsBeanDefinitionParser ......

http://javasourcecode.org/html/open-source/spring/spring-3.0.5/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java.html

这表明你应该为每个'拦截器'构建一个bean,有点像这样......

<bean name="interceptor1" class="com.foo.bar" />
<bean name="interceptor2" class="com.foo.bar2" />
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
    <constructor-arg index="0">
        <null />
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="interceptor1"/>
    </constructor-arg>
</bean>
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
    <constructor-arg index="0">
        <null />
    </constructor-arg>
    <constructor-arg index="1">
        <ref bean="interceptor2"/>
    </constructor-arg>
</bean>

这几乎肯定需要一些修补,但它让你更接近Spring正在做的事情......

尝试一下,如果第一次不能正常工作,请更加注意我上面链接的源代码。

HTH