【问题标题】:Spring Custom Converter - To Bean or Not to BeanSpring 自定义转换器 - 到 Bean 还是不到 Bean
【发布时间】:2018-01-05 00:50:34
【问题描述】:

我正在 Spring 中实现自定义转换器,因此我的 bean 可以从 java.util.Date 转换为 java.time.LocalDateTime。我已经实现了 Converter(通过实现 Spring Converter 接口)

这是@Configuration类中的bean定义

   @Bean
   ConversionService conversionService(){
      DefaultConversionService service = new DefaultConversionService();
      service.addConverter(new DateToLocalDateTimeConverter());
      return service;
    }

我的问题是:我应该将我的自定义转换器作为 Java 对象还是 Spring Bean 传递给service.addConverter? 一般来说,在这种情况下是否 bean 的准则(标准)是什么?

【问题讨论】:

  • 如果你已经在使用 Spring,我认为不使用它的 beans 没有任何好处
  • @IvanPronin 不使用 bean 没有好处,但缺点是 Spring Bean 实例化的开销。你不觉得在这种情况下是多余的吗?

标签: java spring


【解决方案1】:

将对象设为 Spring Bean 是有意义的,因为您希望该对象可以受益于 Spring 特性(注入、事务、aop 等...)。

在您的情况下,似乎不需要。
由于conversionService 是一个将被实例化一次的Spring bean 单例,因此在其实例化过程中创建DateToLocalDateTimeConverter 的普通Java 实例似乎很好:new DateToLocalDateTimeConverter()

现在,如果稍后您想在其他 Spring bean 中注入 DateToLocalDateTimeConverter 实例,将其转换为 Spring Bean 是有意义的。


有关信息 Spring 已经在 Jsr310Converters 类中提供了这个实用程序任务(包含在 spring-data-commons 依赖项中):

import static java.time.LocalDateTime.*;

public abstract class Jsr310Converters {
...
   public static enum DateToLocalDateTimeConverter implements Converter<Date, LocalDateTime> {

      INSTANCE;

      @Override
      public LocalDateTime convert(Date source) {
          return source == null ? null : ofInstant(source.toInstant(), ZoneId.systemDefault());
      }
  }
 ...
}

你可以直接使用它。

【讨论】:

  • 感谢您的全面解释。您稍后提到,如果情况需要,将其转换为 Spring Bean 可能是有意义的。你会怎么做?
  • 不客气 :) 就像你对 conversionBean 所做的那样:通过在 Spring 配置中声明它并在 conversionBean 声明中引用它。
  • 您指定导入是正确的。我通过添加静态导入来改进您的编辑,因为它是在原始类中编写的。
【解决方案2】:

如果您打算将它作为某种依赖注入到您的应用程序中,和/或您打算在多个地方重用它,那么将它注册为 bean 是有意义的。如果您不是,那么newing 实例是可以接受的。

依赖注入和控制反转就是这样——你如何将依赖注入到你的应用程序中,并承认你不再控制它的实例化方式。如果您需要其中任何一种,豆类是合适的;如果你不这样做,那么new它。

【讨论】:

  • ConversionService 将被注入到应用程序的其他 bean 中,因此 bean 可以使用它进行转换。不幸的是,从您的回答中,我不明白为什么将其注册为 bean 是有意义的,在这种情况下,作为 spring bean 而不是 java 对象有什么好处。它是依赖对象,除了作为 ConversionService 的依赖项之外,它不会在自治的任何地方使用,它是 Singleton 本身。所以这意味着它将在每个应用程序生命周期中仅注入一次。请阐述你的观点。谢谢。
【解决方案3】:

在您的简单情况下,似乎没有必要将 DateToLocalDateTimeConverter 添加为 spring bean。

DateToLocalDateTimeConverter 添加为spring bean 的原因:

  • 如果它会使conversionService() 的实现更具可读性(问题示例中不是这种情况)
  • 您需要其他 bean 中的 DateToLocalDateTimeConverter
  • DateToLocalDateTimeConverter 本身的实现需要注入 Spring bean,即使用 @Autowired

【讨论】:

  • 谢谢你的回复,前两点很清楚(虽然第一点是有争议的:))。第二点确实有道理。第三点 - DateToLocalDateTimeConverter 必须是 Spring Bean 才能让其他 Spring bean 被注入和使用吗?
  • 我会说是的。为了能够注入 java 类,我需要由 Spring 管理。并将其添加为 bean 使其受弹簧管理。 (我会试试这个以确保)
  • 刚刚试了一下,我确认:DateToLocalDateTimeConverter本身只能有Spring注入的组件,如果它是一个spring Bean,在Davidxxx的回答中也有说明
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 2014-02-21
相关资源
最近更新 更多