spring-dataops/spring-dataops-printer/README.md
✒ 作者 - Lex 📝 博客 - 掘金 📚 源码地址 - github
本地化和国际化(i18n)
Java API for Formatting
java.text.DateFormat、java.text.SimpleDateFormat 和 java.time.format.DateTimeFormatter,因为这些通常在实现 Printer 接口时使用。ConversionService
ConversionService 是 Spring 中用于管理转换器(Converters)和格式化器(Formatters,包括 Printer 和 Parser)的服务。理解 ConversionService 如何工作,可以帮助您更好地集成和使用 Printer 接口。Printer 接口是 Spring 框架中的一个关键部分,主要用于格式化对象到人类可读的字符串表示。这个接口定义了一个单一的方法 String print(T object, Locale locale),其中 T 是要格式化的对象类型,Locale 是用于格式化操作的地区设置,允许根据不同的文化和地区标准来定制格式化输出。
格式化对象为字符串
支持本地化
Locale 参数,Printer 接口允许根据不同的地区设置来进行格式化,支持国际化和本地化需求。用户界面友好
这个 Printer<T> 接口定义了一个专门用于显示目的的打印方法。它是一个功能性接口,其主要作用是将类型为 T 的对象转换为适合展示的字符串形式。该接口接受两个参数:一个是要打印的对象实例 object,另一个是表示当前用户地区设置的 locale。这样设计的目的是为了支持根据不同地区的标准来格式化对象,从而适应国际化和本地化的需求。
/**
* 用于显示目的打印类型为 T 的对象。
*
* @author Keith Donald
* @since 3.0
* @param <T> 这个 Printer 打印的对象类型
*/
@FunctionalInterface
public interface Printer<T> {
/**
* 打印类型为 T 的对象以供显示。
* @param object 要打印的实例
* @param locale 当前用户的地区设置
* @return 打印出的文本字符串
*/
String print(T object, Locale locale);
}
CharArrayFormatter
CurrencyUnitFormatter
DateFormatter
java.util.Date 对象格式化为易读的日期字符串。它可以支持多种日期格式,并可能根据不同的地区设置进行调整。DurationFormatter
java.time.Duration 实例(表示时间间隔)格式化为易于阅读的字符串,例如,将时长转换为“2小时15分钟”等形式。InetAddressFormatter
java.net.InetAddress 对象(例如,IP 地址)格式化为标准的字符串表示,比如将IP地址从二进制形式转换为点分十进制格式。InstantFormatter
java.time.Instant(表示特定时间点的对象)格式化为日期和时间的字符串表示,通常包括日期和时间。IsoOffsetFormatter
MillisecondInstantPrinter
MonetaryAmountFormatter
MonthDayFormatter
java.time.MonthDay 对象,这种格式化通常涉及将月份和日子转换为特定的字符串格式,如“3月28日”。MonthFormatter
NumberDecoratingFormatter
PatternDecoratingFormatter
PeriodFormatter
java.time.Period 对象(表示日期间隔)格式化为易读的字符串,比如“2年6个月”。ReadableInstantPrinter
ReadableInstant 对象,将它们转换为日期和时间的字符串表示。ReadablePartialPrinter
ReadablePartial 对象,这些对象通常表示部分日期时间信息,如仅月日。TemporalAccessorPrinter
java.time.temporal.TemporalAccessor 接口的日期时间对象,这包括大多数 Java 8 日期时间类型。YearFormatter
YearMonthFormatter
java.time.YearMonth 对象,通常将年和月结合为易读的格式,如“2023年3月”。使用 Spring 的 FormattingConversionService 结合自定义的 CurrencyPrinter 来格式化货币。在这个示例中,首先创建了一个 FormattingConversionService 实例并注册了 CurrencyPrinter。接着,通过设置 LocaleContextHolder 的 Locale,代码分别以美国和中国的格式来显示同一金额的字符串表示。
public class PrinterDemo {
public static void main(String[] args) {
// 创建一个 FormattingConversionService 实例
FormattingConversionService conversionService = new FormattingConversionService();
// 将自定义的 CurrencyPrinter 注册到 conversionService
conversionService.addPrinter(new CurrencyPrinter());
// 设置货币金额
double amount = 1234.56;
// 设置当前线程的 Locale 为美国
LocaleContextHolder.setLocale(Locale.US);
// 使用 conversionService 将金额转换为字符串,并应用美国的货币格式
String formattedAmountForUS = conversionService.convert(amount, String.class);
System.out.println("Formatted Currency (US): " + formattedAmountForUS);
// 设置当前线程的 Locale 为中国
LocaleContextHolder.setLocale(Locale.CHINA);
// 使用 conversionService 将金额转换为字符串,并应用中国的货币格式
String formattedAmountForCHINA = conversionService.convert(amount, String.class);
System.out.println("Formatted Currency (CHINA): " + formattedAmountForCHINA);
}
}
CurrencyPrinter 类实现了 Spring 的 Printer<Number> 接口。它的主要功能是将数字(Number 类型)格式化为货币字符串。在 print 方法中,使用了 Java 的 NumberFormat.getCurrencyInstance 方法来获取相应地区的货币格式化器,并用它将数字转换为该地区特定的货币字符串格式。
public class CurrencyPrinter implements Printer<Number> {
@Override
public String print(Number number, Locale locale) {
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);
return currencyFormat.format(number);
}
}
运行结果发现, CurrencyPrinter 类和 Locale 设置来处理货币的国际化表示,确保金额在不同地区都能以用户熟悉和易于理解的方式呈现。
Formatted Currency (US): $1,234.56
Formatted Currency (CHINA): ¥1,234.56
Parser
Printer 和 Parser 接口通常一起使用。Printer 负责将对象格式化为字符串,而 Parser 负责执行相反的操作,即将字符串解析回原始对象。这种组合在处理表单数据、展示和用户输入时非常有用。Formatter
Formatter 接口结合了 Printer 和 Parser 的功能,提供了一个统一的接口用于格式化和解析对象。任何实现了 Formatter 接口的类同时实现了 print 和 parse 方法,分别对应于 Printer 和 Parser 的功能。FormattingConversionService
FormattingConversionService 是 Spring 的一个核心组件,用于注册和管理格式化器(Formatters)和转换器(Converters)。Printer 接口的实现可以注册到 FormattingConversionService 中,这样,Spring 就可以在需要时自动使用这些实现来格式化数据。DataBinder&WebDataBinder
Printer 接口的实现用于将对象属性转换为适合于显示的字符串。例如,在 Spring MVC 中,WebDataBinder 可以使用注册的 Printer 实现来格式化模型属性以便在视图中显示。Locale
Printer 接口的 print 方法接受一个 Locale 参数,这允许实现类根据不同的地区设置来格式化对象,支持国际化和本地化需求。复杂的格式化逻辑
DateFormat、NumberFormat 等),并结合 Spring 的国际化支持(如 MessageSource)来简化实现。处理不同的地区设置(Locale)
print 方法适当地使用传入的 Locale 参数,并在可能的情况下利用 Spring 的本地化和国际化支持。与 Spring MVC 的集成
Printer 实现,需要确保在 FormattingConversionService 中正确注册了 Printer 实现,并检查控制器方法是否正确使用数据绑定和格式化。保证格式化和解析的一致性
Printer 和对应的 Parser 时,重要的是保证它们对于相同类型的数据有着一致的格式化和解析规则。