其他分享
首页 > 其他分享> > spring 22 对象绑定与类型转换

spring 22 对象绑定与类型转换

作者:互联网

底层第一套转换接口与实现

classDiagram Formatter --|> Printer Formatter --|> Parser class Converters { Set~GenericConverter~ } class Converter class ConversionService class FormattingConversionService ConversionService <|-- FormattingConversionService FormattingConversionService o-- Converters Printer --> Adapter1 Adapter1 --> Converters Parser --> Adapter2 Adapter2 --> Converters Converter --> Adapter3 Adapter3 --> Converters <<interface>> Formatter <<interface>> Printer <<interface>> Parser <<interface>> Converter <<interface>> ConversionService

底层第二套转换接口

classDiagram PropertyEditorRegistry o-- "多" PropertyEditor <<interface>> PropertyEditorRegistry <<interface>> PropertyEditor

高层接口与实现

classDiagram TypeConverter <|-- SimpleTypeConverter TypeConverter <|-- BeanWrapperImpl TypeConverter <|-- DirectFieldAccessor TypeConverter <|-- ServletRequestDataBinder SimpleTypeConverter --> TypeConverterDelegate BeanWrapperImpl --> TypeConverterDelegate DirectFieldAccessor --> TypeConverterDelegate ServletRequestDataBinder --> TypeConverterDelegate TypeConverterDelegate --> ConversionService TypeConverterDelegate --> PropertyEditorRegistry <<interface>> TypeConverter <<interface>> ConversionService <<interface>> PropertyEditorRegistry

类型转换与数据绑定

点击查看代码
 //仅有类型转换功能
        SimpleTypeConverter converter = new SimpleTypeConverter();
        System.out.println(converter.convertIfNecessary("11", int.class));
        System.out.println(converter.convertIfNecessary("2011/01/02", Date.class));
//类型转换与数据绑定 ,根据反射,用 set 方法为 bean 属性赋值
        BeanWrapperImpl beanWrapper = new BeanWrapperImpl();
        S22Bean1 s22Bean1 = new S22Bean1();
        beanWrapper.setBeanInstance(s22Bean1);
        beanWrapper.setPropertyValue("name",13);
        beanWrapper.setPropertyValue("age","32");
        beanWrapper.setPropertyValue("date","2011/11/20");
        System.out.println(s22Bean1);
//类型转换与数据绑定, 利用反射,直接赋值给 bean 的属性,不需要 set 方法
        S22Bean2 s22Bean2 = new S22Bean2();
        DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(s22Bean2);
        fieldAccessor.setPropertyValue("name",22);
        fieldAccessor.setPropertyValue("age","19");
        System.out.println(s22Bean2);
 //类型转换与数据绑定,根据 DirectFieldAccess 存不存在判断用哪种方法数据绑定  默认用 set 方法
        S22Bean2 s22Bean2 = new S22Bean2();
        DataBinder dataBinder = new DataBinder(s22Bean2);
        dataBinder.initDirectFieldAccess();
        MutablePropertyValues propertyValues = new MutablePropertyValues();
        propertyValues.add("name", 34);
        propertyValues.add("age", "12");
        dataBinder.bind(propertyValues);
        System.out.println(s22Bean2);
//类型转换与数据绑定,根据 DirectFieldAccess 存不存在判断用哪种方法数据绑定  默认用 set 方法
        S22Bean2 s22Bean2 = new S22Bean2();
        DataBinder dataBinder = new ServletRequestDataBinder(s22Bean2);
        //可直接对属性进行绑定
        dataBinder.initDirectFieldAccess();
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("name","13");
        request.setParameter("age","13");
        request.setParameter("date","2011/2/2");
        ServletRequestParameterPropertyValues propertyValues = new ServletRequestParameterPropertyValues(request);
        //也可以使用此方式进行数据绑定类型转换
//        propertyValues.add("name", 34);
//        propertyValues.add("age", "12");
        dataBinder.bind(propertyValues);
        System.out.println(s22Bean2);
基本的类型转换与数据绑定用法

数据绑定工厂

点击查看代码

ServletRequestDataBinderFactory 的用法和扩展点
  1. 可以解析控制器的 @InitBinder 标注方法作为扩展点,添加自定义转换器
    • 控制器私有范围
  2. 可以通过 ConfigurableWebBindingInitializer 配置 ConversionService 作为扩展点,添加自定义转换器
    • 公共范围
  3. 同时加了 @InitBinder 和 ConversionService 的转换优先级
    1. 优先采用 @InitBinder 的转换器
    2. 其次使用 ConversionService 的转换器
    3. 使用默认转换器
    4. 特殊处理(例如有参构造)

获取泛型参数

点击查看代码

1. java api 获取泛型参数 2. spring api 获取泛型参数

标签:类型转换,22,--,spring,绑定,s22Bean2,ConversionService,new
来源: https://www.cnblogs.com/xy7112/p/16437801.html