我使用Spring Boot和Java编程配置。我正在使用Spring的ConversionService和Spring的Converter接口的几个自定义实现。我想在配置时使用我的ConversionService bean注册所有转换器。问题是这些转换器中的一些具有它们自己的注释配置的依赖关系,并且这些依赖关系没有被连线。例如,配置类如下所示:
@Configuration
public class MyConfig extends WebMvcConfigurerAdapter
{
@Bean
public ConversionService conversionService(List<Converter> converters)
{
DefaultConversionService conversionService = DefaultConversionService();
for (Converter converter: converters)
{
conversionService.addConverter(converter);
}
return conversionService;
}
}
一些转换器实现可能如下:
@Component
public class ConverterImpl implements Converter
{
@Autowired
private DependentClass myDependency;
//The rest of the implementation
}
尽管conversionService通过配置类添加了每个Converter实现,但转换器实现中没有任何自动装配字段正在填充。它们是空的。
我目前的解决方案如下:
@Component
public class ConverterImpl implements Converter
{
@Lazy
@Autowired
private DependentClass myDependency;
//The rest of the implementation
}
简而言之,转换器实现中的所有自动装配字段也标注为“Lazy”。这似乎可以在首次访问时填充字段。这感觉就像一个黑客。我的问题是:有没有更好的方法来实现我想要的?我在Spring文档中遗漏了什么?整体方法是否存在缺陷?
答案 0 :(得分:1)
我不认为这是一个黑客攻击,但并不能保证永远有效。唯一的另一种方法是在单独的Converters
中创建ApplicationContext
,例如父上下文。请记住,ConversionService
将用于创建bean定义并在注入之前转换依赖项,因此它必须在创建任何其他bean之前可用(因此您的null依赖项存在问题)。