Spring Autowire Hashmap 在 kotlin 中不起作用

Posted

技术标签:

【中文标题】Spring Autowire Hashmap 在 kotlin 中不起作用【英文标题】:Spring Autowire Hashmap not working in kotlin 【发布时间】:2019-08-20 11:03:02 【问题描述】:

我正在将我的应用程序移至 kotlin,并且我的一个文件具有用于实现策略模式的自动装配图。当我将此文件更改为 kotlin 时,Spring 会注入 bean

我已经尝试过lateinit、@jvmfield 等。我一直在进行更改并查看生成的反编译 java,看看它是否清楚为什么会出现错误。看起来它是因为 java 版本中的 hashmap 没有显示类型。

 Hashmap vs HashMap<String,Object>

更改前的 Java 版本。这收集了所有 AudienceService 类型的 bean 并将它们注入到这个地图中

@Autowired
    private Map<String, AudienceService> audienceServiceMap = new HashMap<>();

Kotlin 版本:

    @Autowired
    private lateinit var audienceServiceMap : HashMap<String, AudienceService>

上述kotlin代码的Java反编译版

   @Autowired
   private HashMap audienceServiceMap;

弹簧出错

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'audienceContext': Unsatisfied dependency expressed through field 'audienceServiceMap'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.HashMap<java.lang.String,

【问题讨论】:

将您的 HashMap 引用更改为 Map 好吧,不知何故起作用了!!。但是 java 版本仍然没有显示 Map 所以我的理论是可行的。你能解释一下为什么会这样吗?不管怎样,谢谢!!! 我会写一个答案并解释那部分。很高兴它成功了。 【参考方案1】:

如果您将audienceServiceMap 称为Map&lt;String, AudienceService&gt; 而不是HashMap&lt;...&gt;,Spring 将更容易找到您的bean 并注入它。一般来说,program to an interface and not an implementation 是个好主意。

没有看到你在哪里声明 audienceServiceMap Bean,我只是猜测,但我怀疑 Spring 认为它是 Map,而不是(Java)HashMap,因为你做了这样的事情:

@Bean
fun audienceServiceMap() = mapOf(...)

通过这样做(或类似的方式),Spring 将audienceServiceMap 视为Map,而不是更具体的HashMap

【讨论】:

以上是关于Spring Autowire Hashmap 在 kotlin 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

spring中autowire的用法

[Spring] Autowire

在servlet中用spring @Autowire注入Bean

我如何在可运行的 Spring Boot 中使用 @autowire

从头认识Spring-2.5 @Autowire @Inject @Qualifier @Named的相同与不同

Spring Autowire自动装配