DispatcherServlet之解析controller方法参数上的注解

注:SpringFramework的版本是4.3.x。java

    建议先看个人另外一篇文章,以后再来看这篇。web

                

                             图1 ServletHandlerMethodInvoker的invokeHandlerMethod方法时序图cookie

  1.     将HttpServletRequest中的请求参数转换为Controller类方法上实体类的操做,在步骤3的方法中。
  2.     步骤3的方法resolveHandlerArguments中,首先会取得方法上定义的全部参数类型,做为外层for循环,而后单独对每个参数再进行分析,Java语法中每一个参数是能够定义多个注解的。

    下面给出方法resolveHandlerArguments部分源码片断,以下List-1所示,方法中代码较多,建议读者看源码。ui

    List-1 方法resolveHandlerArguments部分源码this

private Object[] resolveHandlerArguments(Method handlerMethod, Object handler,
		NativeWebRequest webRequest, ExtendedModelMap implicitModel) throws Exception {
	Class<?>[] paramTypes = handlerMethod.getParameterTypes();
	Object[] args = new Object[paramTypes.length];

	for (int i = 0; i < args.length; i++) {
		MethodParameter methodParam = new SynthesizingMethodParameter(handlerMethod, i);
		methodParam.initParameterNameDiscovery(this.parameterNameDiscoverer);
		GenericTypeResolver.resolveParameterType(methodParam, handler.getClass());
		String paramName = null;
		String headerName = null;
		boolean requestBodyFound = false;
		String cookieName = null;
		String pathVarName = null;
		String attrName = null;
		boolean required = false;
		String defaultValue = null;
		boolean validate = false;
		Object[] validationHints = null;
		int annotationsFound = 0;
		Annotation[] paramAnns = methodParam.getParameterAnnotations();

		for (Annotation paramAnn : paramAnns) {
			if (RequestParam.class.isInstance(paramAnn)) {
				RequestParam requestParam = (RequestParam) paramAnn;
				paramName = requestParam.name();
				required = requestParam.required();
				defaultValue = parseDefaultValueAttribute(requestParam.defaultValue());
				annotationsFound++;
			}
			else if (RequestHeader.class.isInstance(paramAnn)) {
				RequestHeader requestHeader = (RequestHeader) paramAnn;
				headerName = requestHeader.name();
				required = requestHeader.required();
				defaultValue = parseDefaultValueAttribute(requestHeader.defaultValue());
				annotationsFound++;
			}
			else if (RequestBody.class.isInstance(paramAnn)) {
				requestBodyFound = true;
				annotationsFound++;
			}
			else if (CookieValue.class.isInstance(paramAnn)) {
				CookieValue cookieValue = (CookieValue) paramAnn;
				cookieName = cookieValue.name();
				required = cookieValue.required();
				defaultValue = parseDefaultValueAttribute(cookieValue.defaultValue());
				annotationsFound++;
			}
......

    这里就是将HttpServletRequest请求数据转换为controller方法参数的入口了,后面就再也不细讲,若是想了解某个特定的注解,从这里着手分析就能够了。.net

相关文章
相关标签/搜索