Spring源代码解析(四):Spring MVC
时间:2011-03-29 javaeye jiwenke
下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可 以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析 DispatcherServlet入手:
代码
//这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各 个Spring MVC主要元素的初始化
protected void initFrameworkServlet() throws ServletException, BeansException {
initMultipartResolver();
initLocaleResolver();
initThemeResolver();
initHandlerMappings();
initHandlerAdapters();
initHandlerExceptionResolvers();
initRequestToViewNameTranslator();
initViewResolvers();
}
看到注解我们知道,这是DispatcherSerlvet的初始化过程,它是在 WebApplicationContext已经存在的情况下进行的,也就意味着在初始化它的时候,IOC容 器应该已经工作了,这也是我们在web.xml中配置Spring的时候,需要把 DispatcherServlet的 load-on-startup的属性配置为2的原因。
对于具体的初始化过程,很容易理解,我们拿initHandlerMappings()来看看:
代码
private void initHandlerMappings() throws BeansException {
if (this.detectAllHandlerMappings) {
// 这里找到所有在上下文中定义的HandlerMapping,同时把他们排序
// 因为在同一个上下文中可以有不止一个handlerMapping,所以我们把他们 都载入到一个链里进行维护和管理
Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors (
getWebApplicationContext(), HandlerMapping.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList(matchingBeans.values ());
// 这里通过order属性来对handlerMapping来在list中排序
Collections.sort(this.handlerMappings, new OrderComparator ());
}
}
else {
try {
Object hm = getWebApplicationContext().getBean (HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
this.handlerMappings = Collections.singletonList(hm);
}
catch (NoSuchBeanDefinitionException ex) {
// Ignore, we''ll add a default HandlerMapping later.
}
}
//如果在上下文中没有定义的话,那么我们使用默认的 BeanNameUrlHandlerMapping
if (this.handlerMappings == null) {
this.handlerMappings = getDefaultStrategies (HandlerMapping.class);
........
}
}
Spring源代码解析(四):Spring MVC(2)
时间:2011-03-29 javaeye jiwenke
怎样获得上下文环境,可以参见我们前面的对IOC容器在web环境中加载的分析。 DispatcherServlet把定义了的所有HandlerMapping都加载了放在一个List里待以后进行 使用,这个链的每一个元素都是一个handlerMapping的配置,而一般每一个 handlerMapping可以持有一系列从URL请求到 Spring Controller的映射,比如 SimpleUrl
HandlerMaaping中就定义了一个map来持有这一系列的映射关系。
DisptcherServlet通过HandlerMapping使得Web应用程序确定一个执行路径,就像我们 在HanderMapping中看到的那样,HandlerMapping只是一个借口:
代码
public interface HandlerMapping {
public static final String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE =
|