【问题标题】:Spring change Map keys after autowiring [duplicate]自动装配后弹簧更改地图键[重复]
【发布时间】:2018-08-22 14:42:16
【问题描述】:

我有一个配置类,我像这样将 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;

在调试模式下,我可以看到地图有另一个键,通过类名:

  • 推荐过滤器
  • 即将到来的过滤器

但不是“RECOMMENDATION”和“UPCOMING”,它是如何在配置中设置的。 谷歌搜索没有帮助。

【问题讨论】:

    标签: java spring dictionary javabeans autowired


    【解决方案1】:

    这会发生,因为你可能有这样的事情

    @Component
    class RecommendationFilter implements Filter{
    
    }
    
    
    @Component
    class UpcomingFilter implements Filter{
    
    }
    

    所以当你这样做时

    @Autowired
    private Map<String, Filter> filterMap;
    

    spring会自动注入Filter的实例,以bean名称为key,以上类的默认bean名称是recommendationFilter和competitiveFilter。

    两种解决方案。

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

    选项 1 将是正确的方法。如上所示,只需将 bean 命名为您想要的任何名称。

    通过显式创建映射,您并没有利用 Spring 的依赖注入魔法。 :) (你为什么要做框架正在为你做的事情,这否定了整个控制反转(IOC)原则)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2012-10-18
      • 2014-07-08
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多