Spring自定义转换器 - Bean或不Bean

时间:2017-07-28 20:47:53

标签: java spring

我在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是否为bean的准则(标准)是什么?

3 个答案:

答案 0 :(得分:1)

如果您打算将此作为某种依赖项注入您的应用程序,和/或您打算在多个位置重用它,那么将它注册为bean是有意义的。如果您,则可以接受new实例。

依赖注入和控制反转就是这样 - 你如何将依赖注入你的应用程序,并确认你不再控制实例化的方式。如果您想要其中任何一种,豆类是合适的;如果你没有,那么new就可以了。

答案 1 :(得分:1)

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

DateToLocalDateTimeConverter添加为spring bean的原因:

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

答案 2 :(得分:0)

使对象成为一个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());
      }
  }
 ...
}

你可以直接使用它。