一尘不染

Spring MVC:为什么这样做 声明工作,而不是传统的XML?

spring-mvc

我试图在Spring MVC中向我的所有Controller / Action
添加一些HandlerInterceptorAdaptor。我将它们添加到我的servlet
XML文件中。

我不明白的是为什么<mvc:interceptors>下面的代码可以工作,而不是使用的传统bean声明DefaultAnnotationHandlerMapping

这是有效的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会自动拾取我的type的bean DefaultAnnotationHandlerMapping,但事实并非如此。

请注意,我使用注释了我的所有Controller类@Controller以及Controller中的方法@RequestMapping

有什么想法吗?


阅读 280

收藏
2020-06-01

共1个答案

一尘不染

Spring实际上正在为每个bean(org.springframework.web.servlet.handler.MappedInterceptor)构造一个“
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的工作…

试试看,如果它不能第一次使用,请仔细阅读上面链接到的源代码。

高温超导

2020-06-01