java - Autowiring 后 Spring 更改 Map 键

标签 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;
}

并在另一个服务中 Autowiring 此 map :

@Autowired
private Map<String, Filter> filterMap;

在 Debug模式下,我可以通过类名称看到映射有另一个键:

  • 推荐过滤
  • 即将推出的过滤器

但不是“推荐”和“即将到来”,它是如何在配置中设置的。 而且谷歌搜索没有帮助。

最佳答案

发生这种情况是因为你可能有这样的事情

@Component
class RecommendationFilter implements Filter{

}


@Component
class UpcomingFilter implements Filter{

}

所以当你这样做

@Autowired
private Map<String, Filter> filterMap;

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

两种解决方案。

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

选项 1 是正确的解决方法。只需按照上面的指示将 bean 命名为您想要的任何名称即可。

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

关于java - Autowiring 后 Spring 更改 Map 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969399/

相关文章:

Java - 如何处理这个 "might not be initialised"错误?

java - IntelliJ IDEA 始终将 MockitoAopProxyTargetInterceptor 显示为 Autowiring

python - 如何为 spacy NLP 创建字典?

Python 按两列或更多列进行分组

Java链表集合方法

将元素添加到列表时出现 java.lang.UnsupportedOperationException

java - Spring boot bcrypt.BCryptPasswordEncoder 和身份验证问题

java - 带有 Gradle 的 Tomcat 上的 Spring REST 服务

c# - Winform 绑定(bind)下拉列表从字典将名称更改为友好名称

java - 如何整合Spring Boot、Cucumber和Mockito?