本文是参阅了另一篇post,地址为:http://my.oschina.net/abian/blog/128028?fromerr=hamVhltR
1.
前面说过Spring MVC中用DispatherServlet捕捉特定URL(取决于web.xml中的servlet-mapping配置)上的HTTP请求之后,会将实际的request转交给用户自定义的Controller来处理,因为DispatherServlet本身并不处理应用的业务逻辑。这就需要一个映射配置(在spring中叫HandlerMapping),根据此Mapping,DispatcherSerlet就知道把当前的HTTP request转交给哪个用户类来处理了。前面已经认识到四种HandlerMapping,即:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
现在有另一种更受欢迎的HandlerMapping: org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,因为上面几个HandlerMapping是将一个URL对应于一个@Controller,而这个却可以用一个@Controller类的不同方法处理不同的URL。
注意,还可在HandlerMapping配置时添加拦截器,做一些额外的工作等等,类似于AOP。
在Spring3.2之后,DefaultAnnotationHandlerMapping被替换为RequestMappingHandlerMapping。
2.
在一个@Controller接到HTTP Request之后,下一个问题就是如何将Request转交到相应的@Controller的方法中去,这就涉及到HandlerAdapter。同样的Spring MVC也提供了几种HandlerAdapter供使用:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdaptor
(在Spring3.2起,使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter代替)
其中AnnotationMethodHandlerAdaptor通常是和DefaultAnnotationHanderMapping配合使用。
3.
配置DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdaptor,Spring提供了一种简便的写法:<mvc:annotation-driven />。
具体可参考类:org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser。
它配置的HandlerMapping是下面两种:
RequestMappingHandlerMapping - 顺序为order=0; mapping requests to annotated controller methods
BeanNameUrlHandlerMapping - 顺序为order=2; map URL paths to controller bean names
你还可以在配置文件中配置其他的HandlerMapping。
它配置的HandlerAdapter是下面三种:
RequestMappingHandlerAdapter - process requests with annotated controller methods
HttpRequestHandlerAdapter - process requests with HttpRequestHandler's
SimpleControllerHandlerAdapter - process requests with interface-based @Controller's
如此即相当于你配置了DefaultAnnotationHandlerMapping和HttpRequestHandlerAdapter。
4.
通过上面的步骤,Spring已经知道怎么查找@Controller以及Controller的方法,接着就要知道去哪里查找Controller或Bean。一种方法是直接在context配置好所以的Bean,如SimpleUrlHandlerMapping,另一种就是让Spring自动扫瞄,此时就需要用到<context:component-scan package="com.yquants.*"/>。要注意的是这个配置并不只是扫瞄含@Component的bean,实际上它会扫瞄所有下面几种注解。