自动装配后弹簧更改地图键

时间:2018-08-22 14:42:16

标签: java spring dictionary javabeans autowired

我有配置类,在其中我像这样将Map创建为Bean。

@Bean
public Map<String, Filter> filters() {
    Map<String, Filter> map = new HashMap<>();
    map.put("RECOMMENDATION", new RecommendationFilter());
    map.put("UPCOMING", new UpcomingFilter());
    return map;
}

然后将此地图自动关联到另一个服务:

@Autowired
private Map<String, Filter> filterMap;

在调试模式下,我可以看到映射具有另一个键,即类名:

  • recommendationFilter
  • upcomingFilter

但不是“ RECOMMENDATION”和“ UPCOMING”(如何在配置中进行设置)。 和谷歌搜索没有帮助。

1 个答案:

答案 0 :(得分:2)

之所以会发生,是因为您可能会遇到类似的情况

@Component
class RecommendationFilter implements Filter{

}


@Component
class UpcomingFilter implements Filter{

}

所以当您这样做

@Autowired
private Map<String, Filter> filterMap;

spring将自动注入Filter的实例,并以bean名称作为键,上述类的默认bean名称为RecommendationFilter和即将到来的Filter。

两种解决方案。

  1. @Component("RECOMMENDATION")
    class RecommendationFilter implements Filter{
    
    }
    
    @Component("UPCOMING")
    class UpcomingFilter implements Filter{
    
    }
    
  2. 从这些类中删除@Component(请注意。这会使它们成为非春季豆类,不确定那是否是您想要的)

选项1将是正确的方法。只需按上述指示为豆子命名即可。

通过显式创建地图,您并没有利用spring的依赖注入魔术。 :)(为什么要做一个框架正在为您做的事情,从而否定了整个控制反转(IOC)原理)