2017-07-28 50 views
1

我在Spring中实现自定义转换器,所以我的豆可以从java.util.Date转换为java.time.LocalDateTime。我已经实现转换器已经(通过实施春季Converter接口)Spring自定义转换器 - 豆或不豆豆

这里是bean定义在@Configuration

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

我的问题是:我要通过我的自定义转换为Java对象或Spring Bean来service.addConverter? 一般来说,在这种情况下,指南(标准)是否要bean或不要bean?

+0

如果你已经在使用Spring,我没有看到没有使用bean的好处 –

+0

@IvanPronin没有使用bean的好处,但缺点是Spring Bean实例化的开销。你不觉得在这种情况下是多余的吗? –

回答

0

使Spring成为一个对象很有意义,因为你希望这个对象可以受益于Spring的特性(注入,事务,aop等等)。

就你而言,似乎并不需要。
As conversionService是一个Spring bean单例,它将被实例化一次,在实例化过程中创建一个普通的java实例DateToLocalDateTimeConverter似乎很好:new DateToLocalDateTimeConverter()

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


的信息春天已经提供了Jsr310Converters类此实用程序任务(包含在弹簧数据公共依赖):

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()); 
     } 
    } 
... 
} 

你可以直接使用它。

+0

谢谢您的全面解释。你后面提到,如果情况需要,将它转换为Spring Bean也许有意义。你会怎么做? –

+0

欢迎您:)正如您为'conversionBean'所做的那样:通过在Spring配置中声明它并在'conversionBean'声明中引用它。 – davidxxx

+0

您指定导入是正确的。我通过添加静态导入来改进编辑,因为它是在原始类中写入的。 – davidxxx

1

如果您打算将其作为某种类型的依赖项注入到您的应用程序中,并且/或者您打算在多个位置重用它,那么将其注册为一个bean是有意义的。如果你是而不是,那么new一个实例是可以接受的。

依赖注入和控制反转就是这样 - 如何将依赖关系注入到应用程序中,以及确认您不再控制如何实例化。如果你想要这些,豆类是适合的;如果你没有,那么new它。

+0

ConversionService将被注入到应用程序的其他bean中,因此bean可以使用它进行转换。不幸的是,从你的回答中,我不明白为什么把它注册为一个bean是有意义的,在这种情况下将spring bean比java对象有什么好处。它是依赖对象,除了作为Singleton本身的'ConversionService'的依赖关系之外,它不用于自治的任何地方。所以这意味着它将在每个应用程序生命周期内仅注入一次。请详细说明你的观点。谢谢。 –

1

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

原因添加DateToLocalDateTimeConverter作为一个Spring bean:

  • 如果它将使conversionService()更具可读性的实现(不是这样的问题的例子)
  • 您在其他豆类
  • 需要 DateToLocalDateTimeConverter
  • 执行DateToLocalDateTimeConverter本身需要注入Spring beans,即使用@Autowired
+0

谢谢你的回复,前两点很明确(虽然第一点可以争论:))。第二点的确有意义。 第三点 - DateToLocalDateTimeConverter必须是Spring Bean才能让其他Spring bean注入并使用它吗? –

+1

我会说是的。为了能够注入到java类中,我需要由Spring进行管理。并且将它添加为一个bean使它可以被管理。 (我会试试这个) –

+1

刚刚尝试过,我确认:'DateToLocalDateTimeConverter'本身只能有Spring注入的组件,如果它是Spring Bean,在Davidxxx的答案中也有说明 –