码迷,mamicode.com
首页 > 其他好文 > 详细

spirng POJO参数映射详解

时间:2017-08-30 14:17:28      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:led   int   val   code   abstract   return   apt   param   img   

DispatcherServlet中执行doDispatch()方法,首先根据映射处理器获得HandlerExecutionChain,后文详解#1

技术分享

 获得处理适配器,后文详解#2

技术分享

执行目标方法,获得ModelAndView,后文详解#3

技术分享

书接前文#1

// 使用RequestMappingHandlerMapping获得

技术分享

// AbstractHandlerMapping中获得HandlerMethod,后文详解#1-1

技术分享

// 创建对象添加一系列拦截器并返回

技术分享

书接前文#1-1

AbstractHandlerMethodMapping中执行getHandlerInternal(request)方法

// 获得请求路径如 /person/add

技术分享

// 根据请求路径获得HandlerMethod,后文详解#1-1-1

技术分享

 // 如果HandlerMethod的bean属性是一个String而不是一个实例,那就通过getBean(beanName)获得实例。后文详解#1-1-2

技术分享

书接前文#1-1-1

通过映射注册器根据请求路径获得RequestMappingInfo ,可参阅RequestMappingHandlerMapping初始化

获得Match集合

技术分享

// 找到最符合的一个Match,返回其HandlerMethod

技术分享

addMatchingMappings(matches)方法内部实现

// 遍历所有的RequestMappingInfo,根据正则匹配请求路径和patterns获得符合的RequestMappingInfo

// matches中添加Match对象(RequestMappingInfo,HandlerMethod

技术分享

 书接前文#1-1-2

技术分享

书接前文#2

 遍历所有的处理适配器

技术分享

 返回RequestMappingHandlerAdapter

技术分享

书接前文#3

 RequestMappingHandlerAdapter中执行目标方法

技术分享

 // 创建方法调度器

技术分享

 // 创建ModelAndView容器

技术分享

 // 方法调度,后文详解#3-1

技术分享

 // 获得ModelAndView,后文详解#3-2

技术分享

书接前文#3-1

参数映射,执行目标方法,返回值

技术分享

 返回值处理,找到合适的返回值处理器如返回值String则找到ViewNameMethodReturnValueHandler,为ModelAndViewContainer的view属性赋值

技术分享

核心部分,POJO参数映射

技术分享

 // 方法反射执行目标方法

技术分享

getMethodArgumentValues()方法内部实现

从HandlerMethod中拿到MethodParameter

技术分享

// HandlerMethodArgumentResolverComposite判断是否有参数解析器支持解析该参数类型
if (this.argumentResolvers.supportsParameter(parameter)) { try {
            // 拿到了ServletModelAttributeMethodProcessor解析器,处理参数 args[i] = this.argumentResolvers.resolveArgument( parameter, mavContainer, request, this.dataBinderFactory); continue; }
}
// 获得参数名
String name = ModelFactory.getNameForParameter(parameter);
// 实例化参数 Object attribute = (mavContainer.containsAttribute(name) ? mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));
// 创建数据绑定器WebRequestDataBinder,设置自定义的属性编辑器

 WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
 if (binder.getTarget() != null) {
   if (!mavContainer.isBindingDisabled(name))

     // 将request域中的属性拿到设置到参数中
     bindRequestParameters(binder, webRequest);
 }

ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;
servletBinder.bind(servletRequest);
// 获得request域中值
MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
doBind(mpvs);

getPropertyAccessor()依旧是获得BeanWrapperImpl对象,通过方法反射设置value值

技术分享

书接前文#3-2

技术分享

 

spirng POJO参数映射详解

标签:led   int   val   code   abstract   return   apt   param   img   

原文地址:http://www.cnblogs.com/BINGJJFLY/p/7452708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!