Spring源码研究:数据绑定

在做Spring MVC时,我们只需用@Controllor来标记Controllor的bean,再用@RequestMapping("标记")来标记需要接受请求的方法,方法中第一个参数为HttpServletRequest类型,最后一个参数为Model类型,中间可以为任何POJO,只要符合标准,有set和get,Spring即可以根据网页请求中的参数名,自动绑定到POJO对象的属性名,这是相当方便的。其中的原理是什么呢?看下源代码就可以知道了。

首先,要知道Method对象的invoke(调用,借助)方法,看下这一段代码:

 Class clazz = Class.forName("TaskProvidePropsList");//这里的类的全名
      Object obj = clazz.newInstance();//获取类的实例
      Field[] fields = clazz.getDeclaredFields();//获取属性列表
      //写数据
      for(Field f : fields) {
       PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);//获取属性对象,要标明是哪个类
       Method wM = pd.getWriteMethod();//获得写方法,即setter
       wM.invoke(obj, 2);//执行obj对象的wm方法,2为参数。因为知道是int类型的属性,所以传个int过去就是了。。实际情况中需要判断下他的参数类型
      }
      //读数据
      for(Field f : fields) {
       PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);//获取属性对象,要标明是哪个类
       Method rM = pd.getReadMethod();//获得读方法,即getter
       Integer num = (Integer) rM.invoke(obj);//执行obj对象的rm方法。因为知道是int类型的属性,所以转换成integer就是了。。也可以不转换直接打印
       System.out.println(num);
}

  用法还是比较简单的。

  接下来就是Spring中是怎么调用这个方法为POJO赋值的。

  最先要追溯到 org.springframework.web.servlet.FrameworkServlet类中的doGet(HttpServletRequest request, HttpServletResponse response)等do方法(do方法是servlet中的基本方法,相当于Spring接管了所有do方法,然后去分发方法。若不使用框架,则需要自己去写servlet继承HttpServlet实现所有do方法,也是可以使用的,但是服务器较大时这样就太复杂了,框架就是为了这个而存在的)

  这个方法中调用processRequest(request, response),processRequest中调用doService(request, response),doService是所有do方法的核心,负责把该请求根据情况分发给不同的service(@RequestMapping注解标明的方法)。

  doService在FrameworkServlet的子类DispatcherServlet(Dispatch:派遣,调度)中实现,doService中又调用doDispatch(request, response),把当前请求分配给合适的Service的合适方法。

  doDispatch方法中调用(HandlerAdapter)ha.handle(processedRequest, response, mappedHandler.getHandler())方法去寻找与该请求挂钩的方法(processedRequest是由checkMultipart(request)转换而来的)(注释中写的Actually invoke the handler.)。

  接着HandlerAdapter中的handle方法

时间: 2024-08-29 10:07:22

Spring源码研究:数据绑定的相关文章

Spring源码研究--下载-编译-导入eclipse-验证

一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直接clone Spring源码到本地:git clone git://github.com/SpringSource/spring-framework.git 2,编译 编译过程,这里所谓的编译是通过gradle工具编译Spring-framework的项目文件,主要干的事情就是下载Spring各个

spring源码研究1

环境 jdk8 windows8 1.下载源码 https://github.com/spring-projects/spring-framework 2.编译为eclipse项目 源码下载无法直接导入eclipse,需要编译为eclipse项目. 进入源码目录下,执行 import-into-eclipse.bat 3.安装插件 groovy 导入eclipse发现还是有地方报错找不到 GroovyDynamicElementReader 需要安装一个eclipse的groovy插件 在ecl

spring源码研究2 自定义标签实现及使用

1.自定义标签实现及使用参考: http://blog.csdn.net/fighterandknight/article/details/50112701 1)创建一个需要扩展的组件 User.java 2)定义一个XSD文件,描述组件内容 user.xsd 3)创建一个java类 MyParser.java ,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义 4)创建一个Handler类 MyNamespaceHandler.java ,扩展子NameS

spring源码研究之IoC容器在web容器中初始化过程

前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spring的IoC容器在web容器如何启动和起作用的并不清楚.所以就抽时间看一下spring的源代码,借此了解它的原理. 我们知道,对于使用Spring的web应用,无须手动创建Spring容器,而是通过配置文件,声明式的创建Spring容器.因此在Web应用中创建Spring容器有如下两种方式: 1. 直接在web.xml文件中配置创建Spring容器. 2. 利用第三方MVC

【一步一步】Spring 源码环境搭建

平时项目中基本上都会用到spring,但是源码还没有深入的了解过.趁这段时间稍微空闲点,开始研究下spring 源码.下面是spring 源码的环境搭建. 主要分为如下步骤: ①安装jdk,gradle,git ②从GitHub下载spring framework 代码 ③编译导入ide中. 第一步安装过程略过. jdk安装成功后通过java -v 输出: gradle 安装整个后通过输入gradle -verson 由于我是之前安装过所以版本要老一些. 以及git 以上第一步已经完成了. 第二

Spring源码学习的初步体会

Spring源码学习的初步体会: 深入学习和巩固java的基础知识,其中的java知识范围全部,可以边研究源码边巩固复习基础知识 体会其中用到的设计思想:其中包含的设计原则和设计模式. 加深对spring的理解,在业务开发中使用spring更容易和深入,提高了生产率.

spring源码转eclipse工程(查看spring源码)

申明:本文大部分是转载的 本例spring源码版本是4.0.0的, 所以jdk需要准备1.8的(不同版本源码要求的jdk不一样) 下载最新版本的Eclipse Luna github Spring 的源码已经从 svn 迁移到 GitHub.而且也改为基于 Gradle 的构建来构建项目.它取代了之前的 Ant+Ivy 系统,所以要构建 Spring 源码环境首先要安装 GitHub 以及 Gradle. 下载 Windows 系统对应的 GitHub 版本下载地址为: https://desk

Spring 源码学习(二)

容器概述 IoC也被称作依赖注入(DI).它是一个处理对象依赖项的过程,也就是将他们一起工作的其他的对象,只有通过构造参数.工厂方法参数或者(属性注入)通过构造参数实例化或通过工厂方法返回对象后再设置属性.当创建bean后,IoC容器再将这些依赖项注入进去.这个过程基本上是反转的,因此得名控制反转(IoC). 下图是 IoC 的高级别视图 IoC容器利用Java的POJO类和配置元数据来生成 完全配置和可执行 的系统或应用程序.而Bean在Spring中就是POJO,也可以认为Bean就是对象.

【Spring源码分析】配置文件读取流程

前言 Spring配置文件读取流程本来是和http://www.cnblogs.com/xrq730/p/6285358.html一文放在一起的,这两天在看Spring自定义标签的时候,感觉对Spring配置文件读取流程还是研究得不够,因此将Spring配置文件读取流程部分从之前的文章拆出来单独成为一文. 为了看一下Spring配置文件加载流程,先定义一个bean.xml: 1 <?xml version="1.0" encoding="UTF-8"?>