SpringMVC 流程

DispatcherServlet                                                                                                                                         
		FrameworkServlet                                                                                                                                     
			HttpServletBean                                                                                                                                  
				HttpServlet                                                                                                                                  
			接口 ApplicationContextAware                                                                                                                       
                                                                                                                                                          
DispatcherServlet 就是一个servlet                                                                                                                             
	1.FrameworkServlet.doGet()或者FrameworkServlet.doPost() 调用processRequest(request, response);                                                               
	2.DispatcherServlet.doService(request, response);                                                                                                        
	所以我们就知道DispatcherServlet 为什么是前端控制器了                                                                                                                      
1、DispatcherServlet 初始化流程                                                                                                                                 
	  1、因为DispatcherServlet是servlet。所以调用init()初始化                                                                                                            
	  2、initServletBean();->initWebApplicationContext() 初始化上下文                                                                                               
	  	若webApplicationContext不为空的时候从SerlvetContext去出根上下文作为它的双亲上下文                                                                                           
			1、这里通过调用子类DispatcherServlet实现的onRefresh方法      onRefresh()                                                                                       
				1、initStrategies(context);启动了整个SpringMVC框架                                                                                                   
					1、initHandlerMappings() 初始化所有的HandlerMapping                                                                                             
						1、从导入所有的HandlerMappingBean,这些Bean有可能存在与双亲容器中,也可能在DispathcerServlet持有的容器的,这里detectAllHandlerMappings默认为true,默认从所有容器中导入                
						2、detectAllHandlerMappings默认为FALSE ,从当前的IOC容器中通过getBean方法获取handlerMapping                                                            
						3、如果还是没有找到hadlerMapping就需要设定默认的handlerMappings了                                                                                      
			2、把当前建立好的上下文存到ServletContext里面去                                                                                                                  
                                                                                                                                                          
2、HTTP请求是如何与对应Handler的对应method映射的                                                                                                                         
		例如:RequestMappingHandlerMapping                                                                                                                      
			1、 spring 实例化RequestMappingHandlerMapping(Bean)的时候,调用AbstractHandlerMethodMapping.afterPropertiesSet();                                          
			2、initHandlerMethods()                                                                                                                           
				1、String[] beanNames 获取容器中所有bean的名字                                                                                                          
				2、遍历 判断 是不是handler  ,isHandler(beanType)->判断是否有Controller或者RequestMapping注解                                                                  
				3、如果是handler,就执行detectHandlerMethods(beanName); 检测发现对应的HandlerMethod                                                                         
					1、通过handlerType 得到一个叫methods的Map,Map的类型是key为Method,value为RequestMappingInfo(key是方法名,value是uri),                                          
					2、循环注册registerHandlerMethod                                                                                                              
						HandlerMethod handlerMethod = createHandlerMethod(handler, method);                                                                  
						1、根据handler和method,创建一个包含handler和method信息的HandlerMethod,                                                                             
						2、注册requestMapping与HandlerMethodInfo的关系                                                                                              
			3、detectHandlerMethods(Object handler)                                                                                                           
				Map<Method, T> methods = MethodIntrospector.selectMethods()                                                                                  
				1、获取这个handler中有requestMapping的方法,放到map中,key为方法信息(public ModelAndView handle01()),value为方法注解信息({[/demo/handle01]})                            
3、SpingMVC处理Http请求原理                                                                                                                                      
		1、http请求先经过DispatcherServlet控制器,调用doService方法,最终调用到doDispatch(request, response);                                                                    
		2、doDispatch(request, response)                                                                                                                      
			1、mappedHandler = getHandler(processedRequest);                                                                                                  
				HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);                                                           
				1、返回了一个包含了HandlerMethod和拦截器链的这么一个对象,                                                                                                         
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());                                                                           
				2、根据handler返回一个支持当前handler的HandlerAdapter                                                                                                    
				3、mappedHandler.applyPreHandle(processedRequest, response) 执行前置拦截器                                                                           
				4、ha.handle(processedRequest, response, mappedHandler.getHandler()); 执行handler方法                                                             
				5、mappedHandler.applyPostHandle(processedRequest, response, mv); 执行后置拦截器                                                                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值