1. 目录

[TOC]

2. 说明

请求适配器主要是处理返回数据的格式问题,即Controller返回的数据对象是视图还是数据,或对数据格式化等

3. 依赖分析

4. 源码分析

从springmvc启动流程可以知道,springmvc请求适配是在initHandlerAdapters()中初始化的

4.1. initHandlerAdapters()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private void initHandlerAdapters(ApplicationContext context) {
this.handlerAdapters = null;

if (this.detectAllHandlerAdapters) {
//从容器中获取到对应的适配器(其默认加载位置同HandlerMapping一样,当配置<mvc:annotation-driven>的时候会加载默认,没有配置注解驱动,查询出来为空, 则会走后面getDefaultStrategies)
Map<String, HandlerAdapter> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerAdapters = new ArrayList<>(matchingBeans.values());
// We keep HandlerAdapters in sorted order.
AnnotationAwareOrderComparator.sort(this.handlerAdapters);
}
}
else {
try {
HandlerAdapter ha = context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);
this.handlerAdapters = Collections.singletonList(ha);
}
catch (NoSuchBeanDefinitionException ex) {
// Ignore, we'll add a default HandlerAdapter later.
}
}

//没有从容器中拿到HandlerAdapter,则取默认值,默认值是从DispatcherServlet.properties中加载的
//DispatcherServlet的静态初始代码块中加载的,即加载类的时候就加入了HandlerAdapter等
if (this.handlerAdapters == null) {
this.handlerAdapters = getDefaultStrategies(context, HandlerAdapter.class);
if (logger.isTraceEnabled()) {
logger.trace("No HandlerAdapters declared for servlet '" + getServletName() +
"': using default strategies from DispatcherServlet.properties");
}
}
}

默认初始化的HandlerAdaptorRequestMappingHnadlerAdaptor

5. 总结

6. 注意事项