Spring使用@Qualifier注入存在交集的Bean列表失败如何解决
问题根因
Spring默认对泛型集合类型的注入逻辑优先级是:优先收集容器内所有匹配泛型类型的单个Bean组成集合,而非直接匹配集合类型的Bean,因此你加的@Qualifier并不会生效,Spring会去找所有Processor类型的Bean,你没有单独注册单个ProcessorBean,所以会提示找不到匹配Bean。
可行解决方案
方案1:使用@Resource按Bean名称注入
这是改动最小的方案,@Resource默认按Bean名称匹配,直接命中你定义的basicProcessors、advancedProcessors这两个List类型的Bean,原有配置类不需要做任何改动即可正常运行:
@Service class B extends A { // 注意这里用@Resource,name属性值对应你定义的Bean名称 @Resource(name = "basicProcessors") public B(List<Processor> processors) { super(processors); } } @Service class C extends A { @Resource(name = "advancedProcessors") public C(List<Processor> processors) { super(processors); } }
方案2:封装自定义集合持有类
如果你需要更严格的类型校验避免名称写错,可以把List包装成自定义实体,再按Qualifier注入:
首先定义持有类:
public class ProcessorGroup { private final List<Processor> processors; public ProcessorGroup(List<Processor> processors) { this.processors = processors; } public List<Processor> getProcessors() { return processors; } }
修改配置类:
@Configuration class ProcessorsConfiguration { @Bean public ProcessorGroup basicProcessors() { return new ProcessorGroup(Arrays.asList(new BasicProcessor())); } @Bean public ProcessorGroup advancedProcessors() { return new ProcessorGroup(Arrays.asList(new BasicProcessor(), new AdvancedProcessor())); } }
修改注入逻辑:
@Service class B extends A { @Autowired public B(@Qualifier("basicProcessors") ProcessorGroup processorGroup) { super(processorGroup.getProcessors()); } } @Service class C extends A { @Autowired public C(@Qualifier("advancedProcessors") ProcessorGroup processorGroup) { super(processorGroup.getProcessors()); } }
方案3:主动从Spring上下文获取
如果不想改动注入注解,也可以直接注入ApplicationContext,主动按名称获取对应的List Bean:
@Service class B extends A { @Autowired public B(ApplicationContext context) { super(context.getBean("basicProcessors", List.class)); } }
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

