Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring自定义转换器-到Bean还是不到Bean_Java_Spring - Fatal编程技术网

Java Spring自定义转换器-到Bean还是不到Bean

Java Spring自定义转换器-到Bean还是不到Bean,java,spring,Java,Spring,我在Spring中实现了自定义转换器,这样我的bean就可以从java.util.Date转换为java.time.LocalDateTime。我已经实现了转换器(通过实现SpringConverter接口) 下面是@Configuration类中的bean定义 @Bean ConversionService conversionService(){ DefaultConversionService service = new DefaultConversionServi

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

下面是
@Configuration
类中的bean定义

   @Bean
   ConversionService conversionService(){
      DefaultConversionService service = new DefaultConversionService();
      service.addConverter(new DateToLocalDateTimeConverter());
      return service;
    }
我的问题是:我应该将自定义转换器作为Java对象或Springbean传递给
service.addConverter

一般来说,在这种情况下是否使用bean的准则(标准)是什么?

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


依赖项注入和控制反转就是——你如何将依赖项注入你的应用程序,以及你不再控制它如何实例化的确认。如果你想要这些,豆子是合适的;如果您不这样做,则
new
将其更新。

将对象设置为Springbean是有意义的,因为您希望该对象可以从Spring特性(注入、事务、aop等)中获益。

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

现在,如果以后要将
DateToLocalDateTimeConverter
实例注入其他Springbean中,将其转换为Springbean是有意义的。


有关信息,Spring已经在
Jsr310Converters
类(包含在Spring数据公用依赖项中)中提供了此实用程序任务:

导入静态java.time.LocalDateTime.*;
公共抽象类JSR310转换器{
...
公共静态枚举DateToLocalDateTimeConverter实现转换器{
实例;
@凌驾
公共LocalDateTime转换(日期源){
返回source==null?null:ofInstant(source.toInstant(),ZoneId.systemDefault());
}
}
...
}

您可以直接使用它。

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

DateToLocalDateTimeConverter
添加为Springbean的原因:

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

如果您已经在使用Spring,我看不到不使用Spring的好处beans@IvanPronin不使用bean并没有好处,但缺点是Springbean实例化的开销。您不认为在这种情况下这是多余的吗?ConversionService将被注入到应用程序的其他bean中,以便bean可以使用它进行转换。不幸的是,从您的回答中,我不理解为什么将其注册为bean是有意义的,在这种情况下,作为springbean而不仅仅是java对象有什么好处。它是依赖对象,在自治中不使用它,除了作为
ConversionService
的依赖项之外,它本身就是单例。因此,它意味着每个应用程序生命周期只注入一次。请阐述你的观点。谢谢。谢谢你的回复,前两点很清楚(尽管第一点有争议:)。第二点确实有道理。第三点-
DateToLocalDateTimeConverter
必须是Springbean才能注入其他Springbean并由它使用吗?我会说是的。为了能够注入java类,我需要由Spring管理。将其添加为bean使其成为spring管理的对象。(我将尝试一下以确保)刚刚尝试过,我确认:
DateToLocalDateTimeConverter
本身只能由Spring注入组件,如果它是Spring Bean,也在Davidxxx的回答中说明。谢谢您的全面解释。您在后面提到,如果情况需要,将其转换为Springbean可能是有意义的。您将如何做到这一点?欢迎:)就像您对
conversionBean
所做的那样:通过在Spring配置中声明它并在
conversionBean
声明中引用它。您指定导入是正确的。我通过在原始类中添加静态导入来改进编辑。
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());
      }
  }
 ...
}