如何用自定义bean替换<mvc:annotation-driven>?

时间:2016-07-05 22:10:09

标签: java spring spring-mvc

据我所知docs<mvc:annotation-driven/>只是注册RequestMappingHandlerMappingRequestMappingHandlerAdapterExceptionHandlerExceptionResolver和其他一些内容的捷径。

我的问题是:如何在不使用<mvc:annotation-driven/>的情况下手动定义提供<mvc:annotation-driven/>的相同功能?

即。我需要Spring配置的示例,它定义和配置由<mvc:annotation-driven/>快捷方式隐式创建的所有bean。换句话说,我需要<mvc:annotation-driven/>的编译版本(包含所有默认值)。

P.S。我需要它,因为<mvc:annotation-driven/>不是那么灵活,并且没有提供配置隐式注册bean的方法(我想配置alwaysUseFullPath的{​​{1}}属性)

2 个答案:

答案 0 :(得分:1)

您甚至无需手动配置所有内容即可。只需配置UrlPathHelper并在配置上进行设置。

<bean id="urlPathHelper" class="org.springframework.web.util.UrlPathHelper">
    <property name="alwaysUseFullPath" value="true" />
<bean>

<mvc:annotation-driven path-helper="urlPathHelper" />

如果因为你使用的是较早的春季版本而无效,请使用BeanPostProcessor并在其postProcessBeforeInitialization中执行您想要的其他设置/初始化。尝试重新创建<mvc:annotation-driven />so, just to set a single property. Instead create a bean which implements BeanPostProcessor`的所有选项会很麻烦

public class WebMvcConfigurer implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            ((RequestMappingHandlerMapping) bean).setAlwaysUseFullPath(true);
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
    }
}

只需将此bean添加到xml配置即可。

答案 1 :(得分:0)

您可以尝试删除<mvc:annotation-driven/>标记,并使用<bean>标记和其他帮助标记明确定义您的所有bean。

另见Howto get rid of <mvc:annotation-driven />?