代码流程分析 这个 类和 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);
===========================================================================