如何在Spring MVC中管理组件以及如何在Spring 3.2.5中注入自定义组件?

时间:2013-12-10 11:45:48

标签: spring spring-mvc

我正在考虑用我自己的一些类替换Spring MVC 3.2.5的 DefaultSessionAttributeStore 实现,而且我从源代码中知道在我的3.2.5 spring源代码中,它是 SessionAttributesHandler ,它拥有 SessionAttributeStore 接口引用并调用会话存储功能。我的问题是如何用DI取代它? SessionAttributesHandler包含最终的私有sessionAttributeStore引用,只能由构造函数设置:

public class SessionAttributesHandler {

    ...

    private final SessionAttributeStore sessionAttributeStore;

    ...


    public SessionAttributesHandler(Class<?> handlerType, SessionAttributeStore sessionAttributeStore) {
        Assert.notNull(sessionAttributeStore, "SessionAttributeStore may not be null.");
        this.sessionAttributeStore = sessionAttributeStore;

        SessionAttributes annotation = AnnotationUtils.findAnnotation(handlerType, SessionAttributes.class);
        if (annotation != null) {
            this.attributeNames.addAll(Arrays.asList(annotation.value()));
            this.attributeTypes.addAll(Arrays.<Class<?>>asList(annotation.types()));
        }

        for (String attributeName : this.attributeNames) {
            this.knownAttributeNames.put(attributeName, Boolean.TRUE);
        }
    }

    ...

}

spring spring容器中是否管理了spring mvc的所有组件?如何将自己的SessionAttributeStore实现注入SessionAttributesHandler?什么是&#34;类handlerType&#34;参数在构造函数中意味着什么?从消息来源来看,它似乎是&#34;控制器&#34;类。由于SessionAttributesHandler是由ModelFactory调用和持有的,而在ModelFactory中没有实例化SessionAttributesHandler的代码,是否有任何&#34; XML&#34; Spring MVC内部组件的bean配置文件以及如何覆盖它们?

1 个答案:

答案 0 :(得分:1)

如果您想提供自己的SessionAttributeStore实施,则需要手动配置RequestMappingHandlerAdapter并在那里设置自定义实施。这将在整个基础设施的整个过程中使用它。

假设您使用java配置,您可以执行以下操作

@Configuration
public class MyConfiguration extend WebMvcConfigurationSupport {

    @Bean
    public SessionAttributeStore sessionAttributeStore() {
        return new MyCustomSessionAttributeStore();
    }

    @Override
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter rmha = super.requestMappingHandlerAdapter();
        rmha.setSessionAttributeStore(sessionAttributeStore());
        return rmha;
    }

}

如果要在XML中执行此操作,则必须编写BeanPostProcessor,将其设置在RequestMappingHandlerAdapter创建的默认<mvc:annotation-driven />实例上,或手动配置并删除命名空间支持