ServletContainer源码分析

代码流程分析 这个 类和 springmvc差不多 解析类上的 Path注解和方法上的Path 就像mvc 解析RequestMapping 一样 不同之处 就在于 mvc可以返回所有类型的对象 而 ServletContainer只返回 Response 返回别的对象它就会再去找这个类中匹配方法,直到返回的是 Response 的对象,返回给请求方。


这个 类和 springmvc差不多
解析类上的 Path注解和方法上的Path
就像mvc 解析RequestMapping 一样
不同之处 就在于 mvc可以返回所有类型的对象 而 ServletContainer只返回 Response 返回别的对象它就会再去找这个类中匹配方法,直到返回的是 Response 的对象,返回给请求方。

ServletContainer解析类,拦截对应的路径,找到对应的方法 ,执行方法,返回结果
在这里插入图片描述

类分析

体系结构
ServletContainer extends HttpServlet implements Filter
方法
构造方法--app构建保存了 一些class对象
public ServletContainer() {
	this.app = null;
}
//这里传入的类 会在初始化的时候解析
public ServletContainer(Class<? extends Application> appClass) {
	this.app = new DeferredResourceConfig(appClass);
}

public ServletContainer(Application app) {
	this.app = app;
}

初始化 解析构造函数传入的类

过滤器初始化
Filter.init(FilterConfig filterConfig)   filterConfig==ApplicationFilterConfig
	this.filterConfig = filterConfig;
	init(new WebFilterConfig(filterConfig));
		webComponent = (app == null) ? new InternalWebComponent() : new InternalWebComponent(app);
        webComponent.init(webConfig);WebComponent.init
			config = webConfig;
			load();
				WebApplication _application = create(); 最后得到 WebApplicationImpl
				configure(config, resourceConfig, _application); 配置资源
				initiate(resourceConfig, _application); 定制自己的web
					ServletContainer.this.initiate(rc, wa);
						 wa.initiate(rc);
							initiate(resourceConfig, null);
							\\\\\\\\\\\\\\\\\\\\\\\\\
								 Errors.processWithErrors(new Errors.Closure<Void>() {
															@Override
															public Void f() {
																Errors.setReportMissingDependentFieldOrMethod(false);
																_initiate(rc, _provider);
																return null;
															}
														});
							\\\\\\\\\\\\\\\\\\\\\\\ 调用 processWithErrors 在调用上面的f()方法 到 _initiate(rc, _provider);
								  _initiate(rc, _provider); 执行的是 WebApplicationImpl._initiate(final ResourceConfig rc, final IoCComponentProviderFactory _provider)
										执行了一大堆看不懂的东西后到达这
										    createAbstractResourceModelStructures();
													for (final Class<?> c : resourceConfig.getRootResourceClasses()) {
														rootARs.add(getAbstractResource(c));
														=======================
														getAbstractResource(c)
															ar = IntrospectionModeller.createResource(c);解析类 就像解析 mvc一样
																final Class<?> annotatedResourceClass = getAnnotatedResourceClass(resourceClass);
																final Path rPathAnnotation = annotatedResourceClass.getAnnotation(Path.class);找类上有没有 Path注解
																resource = new AbstractResource(resourceClass);生成资源类
																final MethodList methodList = new MethodList(resourceClass);
                                                                workOutSetterMethodsList(resource, methodList, isEncodedAnotOnClass);解析方法 
																--------------------解析方法注解
																	for (AnnotatedMethod m : methodList.
																			hasNotMetaAnnotation(HttpMethod.class).              -------HttpMethod
																			hasNotAnnotation(Path.class).						-------Path
																			hasNumParams(1).
																			hasReturnType(void.class).
																			nameStartsWith("set")) {

																		final AbstractSetterMethod asm = new AbstractSetterMethod(resource, m.getMethod(), m.getAnnotations());
																		Parameter p = createParameter(
																				resource.getResourceClass(),
																				m.getMethod().getDeclaringClass(),
																				isEncoded,
																				m.getParameterTypes()[0],
																				m.getGenericParameterTypes()[0],
																				m.getAnnotations());
																		if (null != p) {
																			asm.getParameters().add(p);
																			resource.getSetterMethods().add(asm);把方法的解析结果也放到类的解析的结果里面
																		}
																	}
																------------------
																return resource
															abstractResourceMap.put(c, ar);添加进来保存着
														========================
													}
											RulesMap<UriRule> rootRules = new RootResourceUriRules(this, resourceConfig, wadlFactory, injectableFactory).getRules(); 把上面的数据取出来
											this.rootsRule = new RootResourceClassesRule(rootRules);  下面用到
										          this.rules = UriRulesFactory.create(rulesMap);存起来
									
								  
								  
				application = _application;

拦截对应的端口 执行方法

过滤器执行
ApplicationFilterChain 创建  ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);
	for (int i = 0; i < filterMaps.length; i++) { filterMaps 保存过滤器名字的与过滤路径大的关系
            if (!matchDispatcher(filterMaps[i] ,dispatcher)) {
                continue;
            }
            if (!matchFiltersURL(filterMaps[i], requestPath)) 过滤路径
                continue;
            ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) context.findFilterConfig(filterMaps[i].getFilterName());
            if (filterConfig == null) {
                // FIXME - log configuration problem
                continue;
            }
            filterChain.addFilter(filterConfig);
	}

执行过滤器
filterChain.doFilter(request.getRequest(), response.getResponse());
最后到
	ServletContainer.doFilter(request.getRequest(), response.getResponse());
	    一直doFilter 最后到 这
		final int status = service(baseUri, requestUri, request, response);最后执行方法
			return webComponent.service(baseUri, requestUri, request, response);上面初始化 的 InternalWebComponent(app)
				final WebApplication _application = application; 上面初始化的 application WebApplicationImpl
				_application.handleRequest(cRequest, w); 
					handleRequest(request, response);
						final WebApplicationContext localContext = new WebApplicationContext(this, request, response);       this=WebApplicationImpl
						_handleRequest(localContext, request, response);
							_handleRequest(localContext, request);
								rootsRule.accept(path, null, localContext) --保存了所有接口配置类
									    final Iterator<UriRule> matches = rules.match(path, context);从这些个类里面得到 路径匹配的类
										while(matches.hasNext()) {if(matches.next().accept(path, resource, context)) return true;} 执行他
											return rule.accept(rhpath, resource, context); 这个rule里面保存了 是那个类来处理   ResourceClassRule
												resource = context.getResource(resourceClass);实例化出来
												final Iterator<UriRule> matches = context.getRules(resourceClass).match(path, context);找到是那个方法
								                matches.next().accept(path, resource, context) 
													 return rule.accept(rhpath, resource, context);    
													        当执行的方法返回值不是 Response 执行代码rule=SubLocatorRule
															===========================================================================
															Object subResource = invokeSubLocator(resource, context);调用方法
																	return dispatch(resource, context);
																		return m.invoke(resource, params);jdk反射调用
																		
															//开始执行业务方法了 真正的结果
															final Iterator<UriRule> matches = context.getRules(subResource.getClass()).match(path, context);
															----
															while(matches.hasNext())
																if(matches.next().accept(path, subResource, context))
																	return true;
															----
															matches.next().accept(path, subResource, context) 去执行 业务方法
																	method.getDispatcher().dispatch(resource, context);   ===ResourceJavaMethodDispatcher.dispatch
																		_dispatch(resource, context);  ===ResourceJavaMethodDispatcher._dispatch
																			final Response r = (Response)invoker.invoke(method, resource, params);
																				 return m.invoke(o, parameters); ;jdk反射调用
																			context.getResponse().setResponse(r);
														    ==============================================================================
															当执行的方法返回值是 Response 执行代码rule=HttpMethodRule
															===========================================================================
															method.getDispatcher().dispatch(resource, context); ===ResourceJavaMethodDispatcher.dispatch
																		_dispatch(resource, context);  ===ResourceJavaMethodDispatcher._dispatch
																			final Response r = (Response)invoker.invoke(method, resource, params);
																				 return m.invoke(o, parameters); ;jdk反射调用
																			context.getResponse().setResponse(r);
															===========================================================================
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值