spring mvc 最重要的几个组件如下:
DispatcherServlet:前端控制器, 根据请求url不同将请求路由给不同的Controller处理
HandlerMapping 根据url匹配合适的handler
HandlerAdapter handler有多种实现方式,比如基于annotation, 静态资源实现HttpRequestHandler的handler
ViewResolver 根据controler返回的逻辑view名称匹配合适的view
类图如下
spring mvc对各个组件实现了自动注册,比如context xml配置如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="cn.javacoder.test_mvc"/> </beans>
没有任何关于spring mvc这三大组件的配置,请求也能路由到controller中取, 这是因为在spring-webmvc-*.jar的DispatchServlet.properties文件中指定了各个组件的默认值,当spring构建上下文时发现没有这些组件。就会根据DispatchServlet.properties中的默认值进行注册相应的组件。
序列图如下
如果我们修改context xml文件, 添加
<mvc:annotation-driven/>
注解, 那么spring 启动时会调用AnnotationDrivenBeanDefinitionParser.parse解析<mvc:annotation-driven/>注解,然后为我们注册HandlerMapping, HandlerAdapter,ViewResolver 这三大组件。
序列图如下(图比较大,请在新的窗口中查看原图):
Posted in:spring practise