欢迎大家来到IT世界,在知识的湖畔探索吧!
springMVC框架原理解析
整体工作原理
XML方式
spring-mvc:XXVERsion.jar里的spring.handlers文件里标明解析方式
http\://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler
欢迎大家来到IT世界,在知识的湖畔探索吧!
使用RequestMappingHandlerMapping来对mvc的注解进行扫描
欢迎大家来到IT世界,在知识的湖畔探索吧!public class MvcNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { //这里注册使用RequestMappingHandlerMapping来进行MVC的处理 registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser()); registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser()); registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser()); registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser()); registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser()); registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser()); registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser()); registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("velocity-configurer", new VelocityConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser()); registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser()); } }
注解
注解形式的SpringMvc使用@EnableWebMvc
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }
DelegatingWebMvcConfiguration是一个Configuration形式的配置,里面以@Bean的方式注册了RequestMappingHandlerMapping
看下源码:
WebMvcConfigurationSupport是DelegatingWebMvcConfiguration的父类
欢迎大家来到IT世界,在知识的湖畔探索吧!public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { //向容器注入RequestMappingHandlerMapping @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping(); mapping.setOrder(0); mapping.setInterceptors(getInterceptors()); mapping.setContentNegotiationManager(mvcContentNegotiationManager()); mapping.setCorsConfigurations(getCorsConfigurations()); PathMatchConfigurer configurer = getPathMatchConfigurer(); if (configurer.isUseSuffixPatternMatch() != null) { mapping.setUseSuffixPatternMatch(configurer.isUseSuffixPatternMatch()); } if (configurer.isUseRegisteredSuffixPatternMatch() != null) { mapping.setUseRegisteredSuffixPatternMatch(configurer.isUseRegisteredSuffixPatternMatch()); } if (configurer.isUseTrailingSlashMatch() != null) { mapping.setUseTrailingSlashMatch(configurer.isUseTrailingSlashMatch()); } UrlPathHelper pathHelper = configurer.getUrlPathHelper(); if (pathHelper != null) { mapping.setUrlPathHelper(pathHelper); } PathMatcher pathMatcher = configurer.getPathMatcher(); if (pathMatcher != null) { mapping.setPathMatcher(pathMatcher); } return mapping; } }
DispatcherServlet处理请求
public class DispatcherServlet extends FrameworkServlet { /** List of HandlerMappings used by this servlet */ private List<HandlerMapping> handlerMappings; /** List of HandlerAdapters used by this servlet */ private List<HandlerAdapter> handlerAdapters; protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { //获取RequestMappingHandlerMapping,然后再获取HandlerExecutionChain HandlerExecutionChain mappedHandler = getHandler(processedRequest); //获取RequestMappingHandlerAdapter,真正处理请求的逻辑执行者 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); //执行 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); applyDefaultViewName(processedRequest, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); } } }
下面再来看几个重要的类
HandlerMapping
AnnotationDrivenBeanDefinitionParser解析xml注解会向BeanFactory里注册内置的HandlerMapping
- SimpleUrlHandlerMapping
- RequestMappingHandlerMapping
- BeanNameUrlHandlerMapping
- WebMvcConfigurationSupport.EmptyHandlerMapping
public BeanDefinition parse(Element element, ParserContext parserContext) { //...省略其他代码 //注册最终要的RequestMappingHandlerMapping到容器中 parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, HANDLER_MAPPING_BEAN_NAME)); parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); //注册默认的HandlerMapping MvcNamespaceUtils.registerDefaultComponents(parserContext, source); } }
- 其中最终要的就是RequestMappingHandlerMapping了。
RequestMappingHandlerMapping
RequestMappingHandlerMapping是用来处理SpringMVC注解(@Controller、@RequestMapping)的核心类
RequestMappingHandlerMapping会扫描所有@Controller和@RequestMapping,将处理请求的方法封装为HandlerMethod,存储在MappingRegistry里。
而MappingRegistry则是维护了一个url和对应处理方法的Map,Map> nameLookup
具体的逻辑可查看 RequestMappingHandlerMapping父类AbstractHandlerMethodMapping的afterPropertiesSet方法,这里会做前面的初始化工作
HandlerExecutionChain
HandlerExecutionChain的结构
- handler:HandlerMethod
- bean 实际的controller
- method url请求对应的method
- parameters 方法对应的参数
- interceptors:HandlerInterceptor[]
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22845.html