DispatcherServlet究竟如何将上下文中的Spring MVC组件Bean装配到DispatcherServlet实例中呢?通过查看DispatcherServlet的initStrategies()方法体中的代码,一切的真相就大白于天下了:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(); ①初始化上传文件解析器(直译为多部分请求解析器)
initLocaleResolver(); ②初始化本地化解析器
initThemeResolver(); ③初始化主题解析器
initHandlerMappings(); ④初始化处理器映射器
initHandlerAdapters(); ⑤初始化处理器适配器
initHandlerExceptionResolvers();⑥初始化处理器异常解析器
initRequestToViewNameTranslator();⑦初始化请求到视图名翻译器
initViewResolvers(); ⑧初始化视图解析器
}
initStrategies()方法会在DispatcherServlet对应的WebApplicationContext初始化后自动执行,此时DispatcherServlet上下文中的Bean已经初始化完毕。该方法的工作事先通过一定的发现机制查询上下文中的组件Bean,如果找不到则装配默认的组件实例。
Spring MVC定义了一套默认的组件实现类,也就是说即使不在Spring容器中显式配置组件Bean,也会有一套可用的默认组件出现在DispatcherServlet中。Spring在spring.jar包的org/springframework/web/servlet类路径定义了一个DispatcherServlet.properties配置文件,在其中指定了组件的默认实现类:
①本地化解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.
AcceptHeaderLocaleResolver
②主题解析器
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
③处理器映射器
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.
handler.BeanNameUrlHandlerMapping
④处理器适配器(共3个)
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.
HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.throwaway.ThrowawayControllerHandlerAdapter
⑤请求到视图名翻译器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.
DefaultRequestToViewNameTranslator
⑥视图解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.
InternalResourceViewResolver
你也可以在DispatcherServlet上下文配置文件中显式配置组件Bean以覆盖DispatcherServlet.properties文件中定义的默认组件。
有些类型的组件仅需要配置一个(如本地化解析器),而有些类型的组件可以配置多个,它们组成一个List列表(如处理器映射器)。对于后者来说,组件类都实现了Spring的Ordered接口,你可以在配置时通过order属性指定相应的优先级。
DispatcherServlet优先采用order值小的组件进行操作,如果它无法完成任务才交由次优先级的组件,以此类推。如果同类组件有些设定了order值,有些没有设定,则没有设定order的组件优先级最低,实际上它被设置为Integer.MAX_VALUE。
DispatcherServlet如何在上下文中查找组件Bean并将它们组装到DispatcherServlet实例中呢?这是一个很值得研究的问题。总的来说,DispatcherServlet采用了“约定Bean名”+“匹配组件类型”的机制查找上下文中的组件Bean,如果通过这个发现机制无法找到组件Bean,则转而使用DispatcherServlet.properties文件中定义的默认实现类。对于可以配置多个组件的组件类型,DispatcherServlet允许自动探测父子容器中匹配类型的Bean,并将它们一起装配到DispatcherServlet中。
我们通过表 1说明每种类型组件的装配过程,带(☆)的组件仅有一个,而带(★)的组件可以拥有多个,它们构成一个List:
表 1 装配各型组件的过程
组件类型 | 发现机制 |
文件上传解析器(☆) | 1)查找名为multipartResolver类型为MultipartResolver的Bean作为该类型组件;2)没有默认的实现类。所以如果你没有在上下文中显式定义这一类型的组件,DispatcherServlet中将不会拥有该类型的组件。 | |
本地化解析器(☆) | 1)查找名为localeResolver类型为LocaleResolver的Bean作为该类型·组件;2)如果1)找不到,使用默认的实现类(AcceptHeaderLocaleResolver)创建该类型的组件。 |
主题解析器(☆) | 1)查找名为themeResolver类型为LocaleResolver的Bean作为组件;2)如果1)找不到,使用默认的实现类(FixedThemeResolver)。 |
处理器映射器(★) | 1)如果detectAllHandlerMappings属性为true(默认为true),根据类型匹配(HandlerMapping)机制查找上下文及父Spring容器中所有匹配的Bean,将它们作为该类型组件;2)如果detectAllHandlerMappings属性为false,查找名为handlerMapping类型为HandlerMapping的Bean作为该类型组件;3)如果通过以上方式都找不到,使用BeanNameUrlHandlerMapping实现类创建创建该类型的组件。 |
处理器适配器(★) | 1)如果detectAllHandlerAdapters属性为true(默认为true),根据类型匹配(HandlerAdapter)机制查找上下文及父Spring容器中所有匹配的Bean,将它们作为该类型组件;2)如果detectAllHandlerAdapters属性为false,查找名为handlerAdapter类型为HandlerAdapter的Bean作为该类型组件;3)如果通过以上方式都找不到,使用DispatcherServlet.properties配置文件中指定的三个实现类分别创建一个适配器,添加到适配器列表中。 |
处理器异常解析器(★) | 1)如果detectAllHandlerExceptionResolvers属性为true(默认为true),根据类型匹配(HandlerExceptionResolver)机制查找上下文及父Spring容器中所有匹配的Bean作为该类型组件;2)如果detectAllHandlerExceptionResolvers属性为false,查找名为handlerExceptionResolver类型为HandlerExceptionResolver的Bean作为该类型组件;3)如果通过以上方式都找不到,查找DispatcherServlet.properties中定义的默认实现类,不过该文件中没有对应处理器异常解析器的默认实现类(你可以更改属性文件)。 | |
视图名翻译器(☆) | 1)查找名为viewNameTranslator类型为RequestToViewNameTranslator的Bean作为该类型组件;2)如果1)找不到,使用默认的实现类(DefaultRequestToViewNameTranslator)创建该类型的组件。 |
视图解析器(★) | 1)如果detectAllViewResolvers属性为true(默认为true),根据类型匹配(ViewResolver)机制查找上下文及父Spring容器中所有匹配的Bean作为该类型组件;2)如果detectAllViewResolvers属性为false,查找名为viewResolver类型为ViewResolver的Bean作为该类型组件;3)如果通过以上方式都找不到,通过DispatcherServlet.properties中定义的默认实现类(InternalResourceViewResolver)创建该类型的组件。 |
分享到:
相关推荐
Spring源码学习九:DispatcherServlet初始化源码分析1 DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请求的入口,本篇将深入源码分析它的初始化过程。 首先,从DispatcherServlet的名称上...
本篇文章将深入探讨Spring MVC启动时初始化的几个常用方法,并解释它们在实际开发中的作用。 首先,我们从核心组件`DispatcherServlet`开始。`DispatcherServlet`是Spring MVC的前端控制器,它是整个流程的起点。当...
14. **性能优化**:Spring MVC 4.0在内部做了许多性能优化,包括更快的DispatcherServlet初始化、更高效的HTTP方法映射等。 15. **兼容性与兼容性测试**:Spring MVC 4.0确保与各种Web容器的兼容性,如Tomcat、...
DispatcherServlet 是 Spring MVC 的核心组件之一,负责接收请求并分发给合适的控制器进行处理。其启动流程大致如下: 1. **类的继承关系**:`DispatcherServlet` 继承自 `FrameworkServlet`,而 `FrameworkServlet...
- `web.xml`:配置DispatcherServlet和ContextLoaderListener,前者处理HTTP请求,后者初始化Spring的ApplicationContext。 - `spring-mvc.xml`:配置ViewResolver,比如InternalResourceViewResolver,用于解析...
wpblog.sql可能是数据库的初始化脚本,用于创建这些表结构并可能包含一些初始数据。MySQL是常用的开源关系型数据库管理系统,适用于中小型Web应用,具有良好的性能和稳定性。 **5. 文件结构** - `wpblog.sql`: 这个...
DispatcherServlet通过`web.xml`配置文件或Java配置类进行初始化配置。 2. **Controller**: 控制器是实现业务逻辑的类,通常由开发者编写。它们处理HTTP请求,调用业务服务,然后返回一个模型(Model)和视图(View...
通过运行这个"helloworld spring mvc"项目,开发者可以了解Spring MVC的基本流程:从浏览器发送请求到DispatcherServlet,DispatcherServlet根据配置找到对应的Controller方法执行,然后Controller处理请求并返回一...
2. 配置 Spring:创建 Spring 配置文件(如:applicationContext.xml),配置 DataSource、SqlSessionFactoryBean、MapperScannerConfigurer 等,以便 Spring 可以管理和初始化这些组件。 3. 配置 Mybatis:编写 ...
我们需要在web.xml文件中声明DispatcherServlet,并配置其初始化参数,指向Spring MVC的配置文件(如servlet-context.xml)。 3. **创建Spring MVC配置文件**:在servlet-context.xml中,我们需要定义视图解析器...
4. **集成性**:Spring MVC 完美地集成到 Spring 生态系统中,使得与其他 Spring 组件如 Spring Security、Spring Data 的整合变得非常容易。 #### 二、Spring MVC 核心组件 Spring MVC 的核心组件包括但不限于: ...
- **web.xml**:配置DispatcherServlet,定义Spring MVC的初始化参数。 - **servlet-context.xml**:Spring MVC的核心配置文件,声明拦截器、视图解析器、bean等。 3. **处理器映射器与适配器** - **...
- DispatcherServlet 是 Spring MVC 的入口点,它负责接收客户端的请求并将其分发到合适的组件进行处理。 **2. HandlerMapping 接口** - **作用**:将 HTTP 请求映射到具体的处理方法上。 - **实现类**: - **...
`web.xml` 用于初始化 `DispatcherServlet` 并配置其他必要的 Spring 组件。 控制器由实现了 `Controller` 接口或使用了 `@Controller` 注解的类构成。这些类定义了处理用户请求的方法,通常使用 `@RequestMapping`...
- 配置Spring MVC的DispatcherServlet在web.xml中,设置其初始化参数和映射路径。 - 创建Spring MVC的配置文件,例如`servlet-context.xml`,配置HandlerMapping、HandlerAdapter、ViewResolver等组件。 - 在配置...
DispatcherServlet也初始化了一个WebApplicationContext,它是Spring容器的一个特殊版本,专门用于Web应用。 2. **IoC(Inversion of Control)容器**:Spring MVC中的Controller组件是JavaBean,它们的实例化、...
在web.xml文件中配置了DispatcherServlet,这是Spring MVC的前端控制器,负责接收所有请求并将其分发给相应的处理程序。从提供的部分内容中,我们看到了如下配置: ```xml <servlet-name>lgoumvc ***.mvc...
这涉及到设置DispatcherServlet的初始化参数,如contextConfigLocation(指定Spring MVC配置文件的位置)以及监听器(Listener)和过滤器(Filter)等。 ### 五、控制器(Controller) 控制器是Spring MVC中的关键...
Spring MVC通过DispatcherServlet接收HTTP请求,然后根据请求映射到相应的Controller,Controller处理完业务逻辑后,返回ModelAndView对象,其中包含视图名和模型数据,最后由ViewResolver解析视图并呈现给用户。...