技术开发 频道

Spring MVC快速入门

初始化Spring MVC组件并集成到DispatcherServlet中

    现在我们剩下最后一个问题是: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中。
0
相关文章