我正在考虑用我自己的一些类替换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配置文件以及如何覆盖它们?
答案 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 />
实例上,或手动配置并删除命名空间支持