SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理

目录

一、POJO封装过程

二、原理分析

1.执行方法

2、封装参数 

​编辑3、 初始化

​编辑4、 内置的转换器

 5、绑定pojo的值

6、自定义转换器

1、添加自定义converter

2、原理

 总结


一、POJO封装过程

代码如下,然后进行测试,看看底层到底是如何封装POJO的

@Data
public class User   {
      private String userName;
      private  Integer age;
      private  Dept dept;
}
@Data
public class Dept {

    
    private String deptName;
    private Integer  code;
}
     @ResponseBody
     @PostMapping("/save")
     public User  saveUser( User user){
         System.out.println(user);
        return  user;
     }

 然后我们直接利用postman的表达提交

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第1张图片

 

二、原理分析

1.执行方法

进入处理器映射器对应的处理器适配器

 然后先将27种参数解析器和15种返回结果处理器加入进去SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第2张图片

 接下来执行handle

 117行  执行这个方法

2、封装参数 

 获取请求参数  --也是我们主要看的,如何将参数自动封装到自定义的pojo中SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第3张图片

 

自定义pojo是通过这个参数解析器进行解析 

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第4张图片

通过这一步创建一个空的自定义pojo对象 

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第5张图片3、 初始化

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第6张图片

进入初始化,得到一些转化器

4、 内置的转换器

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第7张图片

 5、绑定pojo的值

 因为是Http文本,有很多格式的问题,因此doBind(mpvs)主要就是要将数据进行转换然后绑定

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第8张图片

 SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第9张图片

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第10张图片 

 

 进入到  setPropertyValues中

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第11张图片

 遍历属性值,进行设置  SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第12张图片

 设置值  真正的设置SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第13张图片

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第14张图片 得到age的值 字符串15 然后进行设置

关键在这里

   判断是否需要转换SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第15张图片

 先判断能不能进行转换

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第16张图片

 成功进入  然后转换

获取一个转换器  要将String 转换为Integer类型的转换器

 

 查找对应的转换器

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第17张图片 

利用工具进行转换 

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第18张图片 

最终age从String变为 Integer

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第19张图片加载进去 

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第20张图片

 

然后每个参数都这样设置即可 

WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);

WebDataBinder :web数据绑定器,将请求参数的值绑定到指定的JavaBean里面

WebDataBinder 利用它里面的 Converters 将请求数据转成指定的数据类型。再次封装到JavaBean中

GenericConversionService:在设置每一个值的时候,找它里面的所有converter那个可以将这个数据类型(request带来参数的字符串)转换到指定的类型(JavaBean -- Integer)

byte -- > file

6、自定义转换器

如果我们想要进行自定义的类型转换。  

例如:我不想使用dept.deptName的方式进行参数的封装

我向使用  一个dept传输   内容用,分割 类似于这样

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第21张图片

 

 我们发现这样出现错误:它无法将这个dept中的字符串内容,封装到Dept类中

因此也就出现了我们自定义类型转换器的情况

原理的时候我们发现Converter转换器,是没有一个将String转换为Dept的因此我们要自定义写一个

即在WebMvcConfigurer中添加一个converter

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第22张图片

1、添加自定义converter

package com.sofwin.config;

import com.sofwin.pojo.Dept;
import com.sofwin.pojo.User;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @packageName: com.sofwin.config
 * @user: wentao
 * @date: 2022/10/8 14:42
 * @email [email protected]
 * @description: TODO
 */
//声明是一个配置类
@Configuration
//继承WebMvcConfigurer
public class MvcConfig implements WebMvcConfigurer {

    //实现addFormattrs
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //在类型转换的注册中加入一个自定义Converter
        registry.addConverter(new Converter() {
            @Override
            public Dept convert(String source) {
                if (!StringUtils.isEmpty(source)){
                    String[] split = source.split(",");
                    Dept dept  =new Dept();
                    dept.setDeptName(split[0]);
                    dept.setCode(Integer.parseInt(split[1]));
                    return  dept;
                }
                return null;
            }
        });
    }
}

加入过后访问就成功了

 SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第23张图片


2、原理

我们打一个断点,看一看Converter是否加入,然后在看一看自定义的Converter是否执行即可

 SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第24张图片SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第25张图片

从124到125多了一个  就是这个我们自定义的String转换为Dept的转化器

 最终会进入到我们写的这个自定义转化器将带,分割的字符串装换为Dept

SpringBoot核心技术篇-web开发2-自定义pojo参数的封装和自定义Converter的原理_第26张图片

 

 总结

这个大概的原理就是这样,其实还是要自己进行debug走一走,效果能好一点,这里包含了很多的设计模式,多看源码对我们的编程是很有帮助的,Spring的源码,行业上是非常认可的

你可能感兴趣的:(SpringBoot的二次学习,java,spring,boot,后端,spring,架构)