最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springMVC4之強大類型轉換器實例解析

 更新時間:2017年04月28日 14:21:45   作者:jeanheo  
本篇文章主要介紹了springMVC4之強大類型轉換器實例解析,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們以自定義格式轉換器的實現(xiàn)思路,來理解新架構的類型轉換器的使用方法,同時在實際開發(fā)中,我們可能會有自己的格式轉換需求,這個時候我們也可以通過自定義格式轉換器來完成這些個性化需求。

自定義格式轉換器

完成自定義轉換器需要實現(xiàn)以下三個中的任意一個接口:Convertor<S,T>、GenericConvertor或ConvertorFacoty。下面我們對這些接口進行逐一分析:

1. Convertor<S,T>

這是最為簡單的一個接口,定義了從源類到目標類的轉換方法。該接口的定義如下

public interface ConverterFactory<S, R> {
  //將S類型的對象轉換為T類型,R為目標類型T的基類
  <T extends R> Converter<S, T> getConverter(Class<T> targetType);
}

2. GenericConvertor

GenericConvertor會根據(jù)源類對象及目標類對象所在宿主類的上下文信息進行類型轉換工作,該接口的定義如下:

public interface GenericConverter {

  //ConvertiblePair包含了源類型和目標類型,它的定義在下面
  Set<ConvertiblePair> getConvertibleTypes();

  //TypeDescriptor包含了需轉換類型對象所在宿主類的信息,我們根據(jù)此信息,完成源到目標類型的轉換
  Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);


  /**
   * 內部類定義
   */
  public static final class ConvertiblePair {
    //源類型
    private final Class<?> sourceType;
    //目標類類型
    private final Class<?> targetType;

    /**
     * 創(chuàng)建一個源-目標對子
     */
    public ConvertiblePair(Class<?> sourceType, Class<?> targetType) {
      Assert.notNull(sourceType, "Source type must not be null");
      Assert.notNull(targetType, "Target type must not be null");
      this.sourceType = sourceType;
      this.targetType = targetType;
    }

    public Class<?> getSourceType() {
      return this.sourceType;
    }

    public Class<?> getTargetType() {
      return this.targetType;
    }
    //忽略hashCode\equals\toString等重寫方法
  }
}

我們常使用其實現(xiàn)類接口:

public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {
}

它除了實現(xiàn)GenericConverter,還實現(xiàn)了另一個“條件轉換器”:

public interface ConditionalConverter {
  /**
   * Should the conversion from {@code sourceType} to {@code targetType} currently under
   */
  //根據(jù)源類型和目標類型所在宿主類型的上下文信息判斷是否要進行類型轉換
  boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType);
}

在實際開發(fā)中,我們能實現(xiàn)此接口自定義轉換器,來根據(jù)具體類型上下文來靈活配置我們的類型轉換

3. ConvertorFacoty

這是一個將我們源類轉換為一個目標類或其子類的”多轉換器共存“接口工廠。它的定義如下:

public interface ConverterFactory<S, R> {

  //獲取將源類轉換為特定R類或其子類的轉換器
  <T extends R> Converter<S, T> getConverter(Class<T> targetType);

}

這個接口一個常見的實現(xiàn)類是StringToNumberConvertor,能將String類型數(shù)據(jù)轉換為Number類型或其子類:Long,Integer,Double等。

注冊自定義轉換器

ConversionService

ConversionService則是Spring類型轉換體系的核心接口,ConversionService接口的定義如下:

package org.springframework.core.convert;

public interface ConversionService {

  //判斷sourceType是否可以轉換為targetType
  boolean canConvert(Class<?> sourceType, Class<?> targetType);

  //TypeDescriptor描述了轉換類的各類上下文信息,在類型轉換實現(xiàn)方法中可以根據(jù)這些信息進行靈活控制
  //比如這里通過源類和目標類的上下文信息判斷是否可以進行轉換
  boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType);

  //將source轉換為targetType
  <T> T convert(Object source, Class<T> targetType);

  //利用源、目標類的上下文信息,將源類型轉換為目標類型
  Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);

}

ConversionServiceFactoryBean

實現(xiàn)以上類型完成我們的自定義轉換器定義后,我們還要在Spring容器中通過ConversionServiceFactoryBean注冊創(chuàng)建后才能使用。

ConversionServiceFactoryBean創(chuàng)建了我們的ConversionService很多內置轉換器,利用這些轉換器,我們可以完成大部分常見的類型轉換工作

而如果我們想使用自定義的類型轉換器,可以通過ConversionServiceFactoryBean的convertor屬性來注冊。

實例分析1:測試Convertor

通過以上的分析,我們接下來嘗試自定實現(xiàn)Convert

1. 自定義屬性轉換器

public class MyConvertor implements Converter<String, User>{

  @Override
  public User convert(String source) {//source為要轉換的字符串
    String[] values = source.split(",");//根據(jù)我們的需求,用逗號來區(qū)分
    Integer id = Integer.valueOf(values[0]);
    User user = new User(id,values[1],values[2]);
    return user;
  }
}
/**********下面是我們的UserPOJO類**********/
public class User {
  public User() {
    super();
  }
  private Integer id;
  private String userName;
  private String password;
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public User(Integer id, String userName, String password) {
    super();
    this.id = id;
    this.userName = userName;
    this.password = password;
  }
  //忽略get和set方法
  @Override
  public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", password="
        + password + "]";
  }

}

2. 注冊自定義屬性轉換器

<!-- 通過:annotation-driven的conversion-service屬性來裝配我們的類型轉換器 -->
<mvc:annotation-driven conversion-service="factoryBean" />
<!-- 通過ConversionServiceFactoryBean注冊我們的自定義轉換器 -->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="factoryBean" >
  <property name="converters"><!-- 在屬性converters注冊 -->
    <list>
      <bean class="com.mvc.convertor.MyConvertor" />
    </list>
  </property>
</bean> 

3. 配置控制器

在控制層,我們通過以下方法測試我們的轉換器

@RequestMapping("convert")
public String convert(User user){
  System.out.println(user);
  return "model1";
}

4. 測試

啟動服務器,在游覽器中訪問[項目根路徑]/convert?user=11,myUserName,myPassword。
控制臺會打印信息:User [id=11, userName=myUserName, password=myPassword]。即springMVC幫我們完成了字符串到User類型的轉換。**這里需注意的是,我們的請求參數(shù)名”user”是和控制層方法入?yún)⒆兞縐ser user像對應的,才能完成參數(shù)綁定進而轉換類型

實例分析2:測試ConvertorFactory

1. 自定義類型轉換器

在實例1的基礎上,我們添加User的一個子類:SuperUser,作為”super”子類,它擁有了自己的專屬名字,我們將字符串”11,myUserName,myPassword,myName“轉換為我們的superUser對象,下面相對應的自定義轉換器和POJO類

public class MySuperConvertor implements Converter<String, SuperUser>{

  @Override
  public SuperUser convert(String source) {
    String[] values = source.split(",");
    Integer id = Integer.valueOf(values[0]);
    SuperUser superUser = new SuperUser(values[3], new User(id,values[1],values[2]));
    return superUser;
  }
}
/**********下面是SuperUser POJO類*********/
package com.mvc.model;

public class SuperUser extends User {
  private String name;
  //忽略get和set方法

  public SuperUser(String name,User user) {
    super(user.getId(),user.getUserName(),user.getPassword());
    this.name = name;
  }

  public SuperUser() {
    super();
  }

  @Override
  public String toString() {
    return "SuperUser [name=" + name + ", toString()=" + super.toString()
        + "]";
  }
}

除了配置上面的轉換器,還需自定義我們的轉換器工廠,在轉換器工廠中,我們根據(jù)目標類型是User還是其子類SuperUser來調用相應的自定義轉換器:

public class MyConvertorFactory implements ConverterFactory<String, User>{

  @Override
  //T類型必須是User或其子類,Stirng是我們的轉換源類
  public <T extends User> Converter<String, T> getConverter(

      Class<T> targetType) {
    if(targetType == User.class){
      return (Converter<String, T>) new MyConvertor();
    }else{
      return (Converter<String, T>) new MySuperConvertor();
    }
  }
}

2. 注冊自定義屬性轉換器

<!-- 通過:annotation-driven的conversion-service屬性來裝配我們的類型轉換器 -->
<mvc:annotation-driven conversion-service="factoryBean" />
<!-- 通過ConversionServiceFactoryBean注冊我們的自定義轉換器 -->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="factoryBean" >
  <property name="converters"><!-- 在屬性converters注冊 -->
    <list>
      <!--這里只要注冊我們自定義的轉換器工廠即可-->
      <bean class="com.mvc.convertor.MyConvertorFactory" />
    </list>
  </property>
</bean> 

3. 配置控制器

在實例1的基礎上,我們添加一個新方法

//這是原來的
@RequestMapping("convert")
public String convert( User user){
  System.out.println(user);
  return "model1";
}
//下面是新添加的方法
@RequestMapping("convertSuper")
public String convert( SuperUser user){
  System.out.println(user);
  return "model1";
}

4. 測試

運行服務器,我們在游覽器中輸入:

1. root/convert?user=10,myUserName,myPassword

控制臺輸出:User [id=10, userName=myUserName, password=myPassword]

2. root/convertSuper?superUser=11,myUserName,myPassword,myName

控制臺輸出:SuperUser [name=myName, toString()=User [id=11, userName=myUserName, password=myPassword]]

我們根據(jù)入?yún)㈩愋?,并通過ConvertFactory,完成對同一系列(某一類及其子類)的類型轉換

源碼下載

本篇文章測試源碼可到https://github.com/jeanhao/spring的dataConvertor文件夾下下載

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Apache Calcite進行SQL解析(java代碼實例)

    Apache Calcite進行SQL解析(java代碼實例)

    Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達的算法與關系體現(xiàn)在具體代碼之中,今天通過代碼實例給大家介紹Apache Calcite進行SQL解析問題,感興趣的朋友一起看看吧
    2022-01-01
  • springboot 如何重定向redirect 并隱藏參數(shù)

    springboot 如何重定向redirect 并隱藏參數(shù)

    這篇文章主要介紹了springboot 如何重定向redirect 并隱藏參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java數(shù)組復制的四種方法效率對比

    java數(shù)組復制的四種方法效率對比

    這篇文章主要介紹了java數(shù)組復制的四種方法效率對比,文中有簡單的代碼示例,以及效率的比較結果,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java泛型與數(shù)據(jù)庫應用實例詳解

    Java泛型與數(shù)據(jù)庫應用實例詳解

    這篇文章主要介紹了Java泛型與數(shù)據(jù)庫應用,結合實例形式詳細分析了java繼承泛型類實現(xiàn)增刪改查操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-08-08
  • 值得收藏的2017年Java開發(fā)崗位面試題

    值得收藏的2017年Java開發(fā)崗位面試題

    這篇文章主要為大家推薦一份值得收藏的2017年Java開發(fā)崗位面試題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 詳解批處理框架之Spring Batch

    詳解批處理框架之Spring Batch

    Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量信息、定時處理大量數(shù)據(jù)等場景十分簡便。結合調度框架能更大地發(fā)揮Spring Batch的作用
    2021-06-06
  • java實現(xiàn)數(shù)字猜拳小游戲

    java實現(xiàn)數(shù)字猜拳小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)數(shù)字猜拳的小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • java?hutool工具類處理JSON的使用方法

    java?hutool工具類處理JSON的使用方法

    hutool是一個java基礎工具類,該工具類經(jīng)過長期的發(fā)展,API已經(jīng)非常齊全,下面這篇文章主要給大家介紹了關于java?hutool工具類處理JSON的使用方法,需要的朋友可以參考下
    2024-04-04
  • 淺談s:select 標簽中l(wèi)ist存放map對象的使用

    淺談s:select 標簽中l(wèi)ist存放map對象的使用

    下面小編就為大家?guī)硪黄獪\談s:select 標簽中l(wèi)ist存放map對象的使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java結構型設計模式中的適配器模式與橋接模式解析

    Java結構型設計模式中的適配器模式與橋接模式解析

    這篇文章主要介紹了Java結構型設計模式中的適配器模式與橋接模式,結構型設計模式是從程序的結構上解決模塊之間的耦合問題,需要的朋友可以參考下
    2016-02-02

最新評論

双流县| 寻乌县| 吉首市| 安庆市| 芜湖市| 桃园县| 韶山市| 临沧市| 恩平市| 屏边| 天等县| 普兰店市| 密云县| 内乡县| 洛浦县| 吉林市| 邵东县| 加查县| 堆龙德庆县| 庄河市| 苏尼特右旗| 同德县| 彩票| 左云县| 津市市| 清镇市| 班玛县| 彰化市| 军事| 玛曲县| 红桥区| 锦州市| 呼玛县| 韶关市| 丽水市| 南汇区| 手机| 宕昌县| 澄迈县| 太和县| 聂拉木县|