Java Spring自定义转换器-到Bean还是不到Bean
我在Spring中实现了自定义转换器,这样我的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
java.util.Date
转换为java.time.LocalDateTime
。我已经实现了转换器(通过实现SpringConverter
接口)
下面是@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
本身的实现需要注入SpringBean,即使用DateToLocalDateTimeConverter
@Autowired
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());
}
}
...
}