欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springMVC4之強(qiáng)大類(lèi)型轉(zhuǎn)換器實(shí)例解析

 更新時(shí)間:2017年04月28日 14:21:45   作者:jeanheo  
本篇文章主要介紹了springMVC4之強(qiáng)大類(lèi)型轉(zhuǎn)換器實(shí)例解析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

自定義格式轉(zhuǎn)換器

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

1. Convertor<S,T>

這是最為簡(jiǎn)單的一個(gè)接口,定義了從源類(lèi)到目標(biāo)類(lèi)的轉(zhuǎn)換方法。該接口的定義如下

public interface ConverterFactory<S, R> {
  //將S類(lèi)型的對(duì)象轉(zhuǎn)換為T(mén)類(lèi)型,R為目標(biāo)類(lèi)型T的基類(lèi)
  <T extends R> Converter<S, T> getConverter(Class<T> targetType);
}

2. GenericConvertor

GenericConvertor會(huì)根據(jù)源類(lèi)對(duì)象及目標(biāo)類(lèi)對(duì)象所在宿主類(lèi)的上下文信息進(jìn)行類(lèi)型轉(zhuǎn)換工作,該接口的定義如下:

public interface GenericConverter {

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

  //TypeDescriptor包含了需轉(zhuǎn)換類(lèi)型對(duì)象所在宿主類(lèi)的信息,我們根據(jù)此信息,完成源到目標(biāo)類(lèi)型的轉(zhuǎn)換
  Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);


  /**
   * 內(nèi)部類(lèi)定義
   */
  public static final class ConvertiblePair {
    //源類(lèi)型
    private final Class<?> sourceType;
    //目標(biāo)類(lèi)類(lèi)型
    private final Class<?> targetType;

    /**
     * 創(chuàng)建一個(gè)源-目標(biāo)對(duì)子
     */
    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ě)方法
  }
}

我們常使用其實(shí)現(xiàn)類(lèi)接口:

public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {
}

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

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

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

3. ConvertorFacoty

這是一個(gè)將我們?cè)搭?lèi)轉(zhuǎn)換為一個(gè)目標(biāo)類(lèi)或其子類(lèi)的”多轉(zhuǎn)換器共存“接口工廠。它的定義如下:

public interface ConverterFactory<S, R> {

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

}

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

注冊(cè)自定義轉(zhuǎn)換器

ConversionService

ConversionService則是Spring類(lèi)型轉(zhuǎn)換體系的核心接口,ConversionService接口的定義如下:

package org.springframework.core.convert;

public interface ConversionService {

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

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

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

  //利用源、目標(biāo)類(lèi)的上下文信息,將源類(lèi)型轉(zhuǎn)換為目標(biāo)類(lèi)型
  Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);

}

ConversionServiceFactoryBean

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

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

而如果我們想使用自定義的類(lèi)型轉(zhuǎn)換器,可以通過(guò)ConversionServiceFactoryBean的convertor屬性來(lái)注冊(cè)。

實(shí)例分析1:測(cè)試Convertor

通過(guò)以上的分析,我們接下來(lái)嘗試自定實(shí)現(xiàn)Convert

1. 自定義屬性轉(zhuǎn)換器

public class MyConvertor implements Converter<String, User>{

  @Override
  public User convert(String source) {//source為要轉(zhuǎn)換的字符串
    String[] values = source.split(",");//根據(jù)我們的需求,用逗號(hào)來(lái)區(qū)分
    Integer id = Integer.valueOf(values[0]);
    User user = new User(id,values[1],values[2]);
    return user;
  }
}
/**********下面是我們的UserPOJO類(lèi)**********/
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. 注冊(cè)自定義屬性轉(zhuǎn)換器

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

3. 配置控制器

在控制層,我們通過(guò)以下方法測(cè)試我們的轉(zhuǎn)換器

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

4. 測(cè)試

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

實(shí)例分析2:測(cè)試ConvertorFactory

1. 自定義類(lèi)型轉(zhuǎn)換器

在實(shí)例1的基礎(chǔ)上,我們添加User的一個(gè)子類(lèi):SuperUser,作為”super”子類(lèi),它擁有了自己的專(zhuān)屬名字,我們將字符串”11,myUserName,myPassword,myName“轉(zhuǎn)換為我們的superUser對(duì)象,下面相對(duì)應(yīng)的自定義轉(zhuǎn)換器和POJO類(lèi)

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類(lèi)*********/
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()
        + "]";
  }
}

除了配置上面的轉(zhuǎn)換器,還需自定義我們的轉(zhuǎn)換器工廠,在轉(zhuǎn)換器工廠中,我們根據(jù)目標(biāo)類(lèi)型是User還是其子類(lèi)SuperUser來(lái)調(diào)用相應(yīng)的自定義轉(zhuǎn)換器:

public class MyConvertorFactory implements ConverterFactory<String, User>{

  @Override
  //T類(lèi)型必須是User或其子類(lèi),Stirng是我們的轉(zhuǎn)換源類(lèi)
  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. 注冊(cè)自定義屬性轉(zhuǎn)換器

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

3. 配置控制器

在實(shí)例1的基礎(chǔ)上,我們添加一個(gè)新方法

//這是原來(lái)的
@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. 測(cè)試

運(yùn)行服務(wù)器,我們?cè)谟斡[器中輸入:

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

控制臺(tái)輸出:User [id=10, userName=myUserName, password=myPassword]

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

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

我們根據(jù)入?yún)㈩?lèi)型,并通過(guò)ConvertFactory,完成對(duì)同一系列(某一類(lèi)及其子類(lèi))的類(lèi)型轉(zhuǎn)換

源碼下載

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea gradle項(xiàng)目復(fù)制依賴小技巧(推薦)

    idea gradle項(xiàng)目復(fù)制依賴小技巧(推薦)

    這篇文章主要介紹了idea gradle項(xiàng)目復(fù)制依賴小技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java動(dòng)態(tài)代理(jdk與cglib)詳細(xì)解析

    java動(dòng)態(tài)代理(jdk與cglib)詳細(xì)解析

    靜態(tài)代理:由程序員創(chuàng)建或特定工具自動(dòng)生成源代碼,再對(duì)其編譯。在程序運(yùn)行前,代理類(lèi)的.class文件就已經(jīng)存在了
    2013-09-09
  • 關(guān)于yml文件字符串,List,Map的書(shū)寫(xiě)方式并使用@ConfigurationProperties注入配置類(lèi)

    關(guān)于yml文件字符串,List,Map的書(shū)寫(xiě)方式并使用@ConfigurationProperties注入配置類(lèi)

    這篇文章主要介紹了關(guān)于yml文件字符串,List,Map的書(shū)寫(xiě)方式并使用@ConfigurationProperties注入配置類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解SpringMVC重定向傳參數(shù)的實(shí)現(xiàn)

    詳解SpringMVC重定向傳參數(shù)的實(shí)現(xiàn)

    本篇文章主要介紹了詳解SpringMVC重定向傳參數(shù)的實(shí)現(xiàn),我們可以使用重定向的方式,改變?yōu)g覽器的地址欄,防止表單因?yàn)樗⑿轮貜?fù)提交。有興趣的可以了解一下。
    2017-01-01
  • springboot中@Value的工作原理說(shuō)明

    springboot中@Value的工作原理說(shuō)明

    這篇文章主要介紹了springboot中@Value的工作原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JAVA讀取文件夾大小的幾種方法實(shí)例

    JAVA讀取文件夾大小的幾種方法實(shí)例

    這篇文章介紹了JAVA讀取文件夾大小的幾種方法實(shí)例,有需要的朋友可以參考一下
    2013-10-10
  • java 取模與取余的區(qū)別說(shuō)明

    java 取模與取余的區(qū)別說(shuō)明

    這篇文章主要介紹了java 取模與取余的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • maven+springboot打成jar包的方法

    maven+springboot打成jar包的方法

    這篇文章主要介紹了maven+springboot打成jar包的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Java創(chuàng)建對(duì)象的四種方式詳解

    Java創(chuàng)建對(duì)象的四種方式詳解

    這篇文章主要介紹了Java創(chuàng)建對(duì)象的四種方式詳解,如果我們不想利用默認(rèn)構(gòu)造器來(lái)創(chuàng)建java對(duì)象,而想利用指定的構(gòu)造器來(lái)創(chuàng)建java對(duì)象,則需要利用Construtor對(duì)象,每個(gè)Construtor對(duì)應(yīng)一個(gè)構(gòu)造器,需要的朋友可以參考下
    2023-11-11
  • Spring?Boot集成etcd的詳細(xì)過(guò)程

    Spring?Boot集成etcd的詳細(xì)過(guò)程

    etcd是一個(gè)分布式鍵值存儲(chǔ)數(shù)據(jù)庫(kù),用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語(yǔ)言編寫(xiě),具有出色的跨平臺(tái)支持,很小的二進(jìn)制文件和強(qiáng)大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08

最新評(píng)論