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

Spring中的ConversionService源碼解析

 更新時間:2023年11月30日 09:45:16   作者:啊幾  
這篇文章主要介紹了Spring中的ConversionService源碼解析,ConversionService是類型轉換服務的接口,從名字就可以看出ConverterRegistry是要實現(xiàn)轉換器注冊表的接口,添加和移除Converter和GenericConverter,需要的朋友可以參考下

ConversionService是什么

ConversionService是類型轉換服務的接口,最涉及的類有以下:

在這里插入圖片描述

學習類型轉換服務之前我們先看看各個接口是做什么的

ConversionService接口

ConversionService接口的方法很簡單,就是判斷是否可以兩種類型是否可以轉換,和轉換方法

在這里插入圖片描述

ConversionRegistry接口

從名字就可以看出ConverterRegistry是要實現(xiàn)轉換器注冊表的接口,添加和移除Converter和GenericConverter。

在這里插入圖片描述

FormatterRegistry接口

FormatterRegistry接口是ConverterRegistry的子接口

在這里插入圖片描述

在這里插入圖片描述

在學這個接口之前要先了解Formatter是什么?

Formatter是什么?

Formatter是一種用于格式化和解析對象的接口,它可以將一個對象轉化為字符串,或將一個字符串轉化為特定類型的對象。在Spring MVC中,F(xiàn)ormatter通常用于將HTTP請求中的參數(shù)綁定到Java對象上,或將Java對象轉化為HTTP響應中的數(shù)據(jù)。

在這里插入圖片描述

Formatter接口繼承了Printer和Parse兩個接口

public interface Printer<T> {

	String print(T object, Locale locale);
	
}
public interface Parser<T> {

	T parse(String text, Locale locale) throws ParseException;

}

Printer接口就是對象轉換為String類型的接口,Parse接口就是將String類型轉換為特定類型對象的接口。在Spring中Formatter接口的實現(xiàn)也是非常多

在這里插入圖片描述

所以如果不需要使用String類型和對象類型的轉換,使用GenericConversionService或DefaultConversionService就可以了

ConfigurableConversionService接口

ConfigurableConversionService繼承了ConversionService和ConversionRegistry接口,從類型轉換服務涉及的類可以看出ConversionService類型轉換服務都是需要和ConverterRegistry轉換器注冊表接口配合使用的。所以ConversionService的實現(xiàn)類都是實現(xiàn)了ConfigurableConversionService接口的。

在這里插入圖片描述

Converter和GenericConverter的區(qū)別

Converter是一個通用的類型轉換器,它可以將一個類型轉換為另一個類型。它只能轉換一種類型,因此需要為每種類型都定義一個Converter。

GenericConverter是一個更通用的類型轉換器,它可以將多種類型轉換為多種類型。它可以處理多種不同的類型轉換場景,因此可以減少定義Converter的數(shù)量。GenericConverter可以在轉換過程中使用類型信息來決定如何轉換。

總的來說,Converter適用于單一類型轉換,而GenericConverter適用于多種類型轉換。 GenericConversionService也提供了一個內部類ConverterAdapter,用來將Converter適配成GenericConverter,這里用了適配器模式

ConversionService的各個實現(xiàn)類有什么區(qū)別?又該如何選擇呢?

首先看DefaultFormattingConversionService的構造方法,里面通過DefaultConversionService的靜態(tài)方法添加了默認的一些Converter還有一些默認的Formatter,可以猜測到DefaultFormattingConversionService比DefaultConversionService多添加了默認的Formatter

public DefaultFormattingConversionService(
			@Nullable StringValueResolver embeddedValueResolver, boolean registerDefaultFormatters) {

		if (embeddedValueResolver != null) {
			setEmbeddedValueResolver(embeddedValueResolver);
		}
		DefaultConversionService.addDefaultConverters(this);
		if (registerDefaultFormatters) {
			addDefaultFormatters(this);
		}
	}

下面是默認添加的一些Converter

	public static void addDefaultConverters(ConverterRegistry converterRegistry) {
		addScalarConverters(converterRegistry);
		addCollectionConverters(converterRegistry);

		converterRegistry.addConverter(new ByteBufferConverter((ConversionService) converterRegistry));
		converterRegistry.addConverter(new StringToTimeZoneConverter());
		converterRegistry.addConverter(new ZoneIdToTimeZoneConverter());
		converterRegistry.addConverter(new ZonedDateTimeToCalendarConverter());

		converterRegistry.addConverter(new ObjectToObjectConverter());
		converterRegistry.addConverter(new IdToEntityConverter((ConversionService) converterRegistry));
		converterRegistry.addConverter(new FallbackObjectToStringConverter());
		converterRegistry.addConverter(new ObjectToOptionalConverter((ConversionService) converterRegistry));
	}

下面是默認添加的一些Formatter

	public static void addDefaultFormatters(FormatterRegistry formatterRegistry) {
		// Default handling of number values
		formatterRegistry.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());

		// Default handling of monetary values
		if (jsr354Present) {
			formatterRegistry.addFormatter(new CurrencyUnitFormatter());
			formatterRegistry.addFormatter(new MonetaryAmountFormatter());
			formatterRegistry.addFormatterForFieldAnnotation(new Jsr354NumberFormatAnnotationFormatterFactory());
		}

		// Default handling of date-time values

		// just handling JSR-310 specific date and time types
		new DateTimeFormatterRegistrar().registerFormatters(formatterRegistry);

		if (jodaTimePresent) {
			// handles Joda-specific types as well as Date, Calendar, Long
			new org.springframework.format.datetime.joda.JodaTimeFormatterRegistrar().registerFormatters(formatterRegistry);
		}
		else {
			// regular DateFormat-based Date, Calendar, Long converters
			new DateFormatterRegistrar().registerFormatters(formatterRegistry);
		}
	}

所以如果要使用Spring自帶的一些Formatter和Converter可以使用DefaultFormattingConversionService比DefaultConversionService,如果不需要可以使用FormatterConversionService或GenericConversionService。

ConversionService的使用示例

	public static void main(String[] args) {

		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		UserService userService = (UserService) applicationContext.getBean("userService");

		FormattingConversionService conversionService = new DefaultFormattingConversionService();
		
		//String -> ArrayList
		System.out.println(conversionService.convert("1,2,3,4", ArrayList.class));
		
		//boolean -> String
		System.out.println(conversionService.convert(true,String.class));
		
		//自定義了一個格式化器,OrderService -> String ,String -> OrderService
		conversionService.addFormatter(new Formatter<OrderService>() {
			private ObjectMapper objectMapper = new ObjectMapper();
			@Override
			public String print(OrderService object, Locale locale) {
				try {
					return objectMapper.writeValueAsString(object);
				} catch (JsonProcessingException e) {
					throw new RuntimeException(e);
				}
			}

			@Override
			public OrderService parse(String text, Locale locale) throws ParseException {
				try {
					return  objectMapper.readValue(text,OrderService.class);
				} catch (JsonProcessingException e) {
					throw new RuntimeException(e);
				}
			}
		});
		String result = conversionService.convert(userService.getOrderService(),String.class);
		System.out.println(result);
		OrderService orderService = conversionService.convert(result, OrderService.class);
		System.out.println(orderService);
	}


測試結果

[1, 2, 3, 4]
true
{"user":{}}
com.zhouyu.service.OrderService@2bbf180e

到此這篇關于Spring中的ConversionService源碼解析的文章就介紹到這了,更多相關ConversionService源碼解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中checkbox實現(xiàn)跨頁多選的方法

    Java中checkbox實現(xiàn)跨頁多選的方法

    最近做了一個項目其中遇到這樣的需求,要實現(xiàn)checkbox跨頁多選功能,經過小編整理,順利解決,今天小編給大家分享Java中checkbox實現(xiàn)跨頁多選的方法,需要的的朋友參考下
    2017-01-01
  • Java如何獲取視頻文件的視頻時長

    Java如何獲取視頻文件的視頻時長

    文章介紹了如何使用Java獲取視頻文件的視頻時長,包括導入maven依賴和代碼案例,同時,也討論了在運行過程中遇到的SLF4J加載問題,并給出了解決方案
    2025-02-02
  • 使用Java實現(xiàn)驗證碼程序

    使用Java實現(xiàn)驗證碼程序

    這篇文章主要為大家詳細介紹了使用Java實現(xiàn)驗證碼程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MybatisPlus代碼生成器含XML文件詳解

    MybatisPlus代碼生成器含XML文件詳解

    這篇文章主要介紹了MybatisPlus代碼生成器含XML文件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中字符編碼問題的解決方法詳解

    Java中字符編碼問題的解決方法詳解

    在日常 Java 開發(fā)中,字符編碼問題是一個非常常見卻又特別容易踩坑的地方,這篇文章就帶你一步一步看清楚字符編碼的來龍去脈,并結合可運行的代碼,看看如何在 Java 項目里徹底解決編碼不一致的問題
    2025-09-09
  • java中throws與try...catch的區(qū)別點

    java中throws與try...catch的區(qū)別點

    在本篇文章里小編給大家整理了一篇關于java中throws與try...catch的區(qū)別點的內容,需要的朋友們跟著學習下。
    2020-02-02
  • JDK8中String的intern()方法實例詳細解讀

    JDK8中String的intern()方法實例詳細解讀

    String字符串在我們日常開發(fā)中最常用的,當然還有他的兩個兄弟StringBuilder和StringBuilder,接下來通過本文給大家介紹JDK8中String的intern()方法詳細解讀,需要的朋友可以參考下
    2022-09-09
  • SpringCloud使用logback日志框架教程詳解

    SpringCloud使用logback日志框架教程詳解

    Logback是一個功能強大的日志框架,它是一個基于slf4j的日志系統(tǒng),提供了可靠的日志服務,比log4j更快,更靈活,更容易使用。本文將教會你快速讓你的項目集成logback日志框架,需要的朋友可以參考下
    2023-05-05
  • Mybatis-plus數(shù)據(jù)權限DataPermissionInterceptor實現(xiàn)

    Mybatis-plus數(shù)據(jù)權限DataPermissionInterceptor實現(xiàn)

    本文主要介紹了Mybatis-plus數(shù)據(jù)權限DataPermissionInterceptor實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java HashMap從鏈表到紅黑樹的"進化"過程詳解

    Java HashMap從鏈表到紅黑樹的"進化"過程詳解

    在Java集合框架中,HashMap的底層實現(xiàn)在JDK 1.8迎來了一次重大革新:引入了紅黑樹,本文將結合底層源碼,帶你徹底搞懂HashMap是在什么條件下、如何進行樹化的,感興趣的朋友跟隨小編一起看看吧
    2026-02-02

最新評論

南皮县| 阿克苏市| 榆社县| 旬邑县| 平塘县| 蚌埠市| 永春县| 新余市| 东港市| 盐池县| 巴林左旗| 桦南县| 永清县| 泾阳县| 微山县| 万州区| 隆安县| 乌兰浩特市| 大石桥市| 黄陵县| 阜南县| 丽江市| 阳山县| 武穴市| 虹口区| 红原县| 星子县| 保山市| 丹东市| 莲花县| 张家界市| 兰州市| 安泽县| 无棣县| 同德县| 十堰市| 确山县| 苗栗市| 东丽区| 石河子市| 青岛市|