如何在使用注释时声明Spring bean autowire-candidate =“false”?

我正在使用@ComponentScan@Component来定义我的spring bean。 我想要的是将这些bean中的一个声明为autowire-candidate=false

这可以使用xml中的此属性来完成。 是不是注释中的等价物?

我想要这个的原因是因为我有2个相同接口的实现,我不想使用@Qualifier

编辑:使用@Primary是一个有效的解决方案,但autowire候选人在我看来似乎是一个有用的function与自己的语义。

谢谢

看起来Spring拒绝了autowire-candidate=false概念,它不再受支持。 没有带注释的模拟,所以@Primary是你注意到的最好的解决方法。

另一种方法是使用自定义org.springframework.beans.factory.support.AutowireCandidateResolver (在DefaultListableBeanFactory使用),其逻辑可以从autowire候选中排除不需要的bean。 在这种情况下,该技术将类似于SimpleAutowireCandidateResolver用于autowire-candidate=falseSimpleAutowireCandidateResolver

您还可以使用bean访问器来调整它的可见性。

看到Bean的可见性

 @Configuration public abstract class VisibilityConfiguration { @Bean public Bean publicBean() { Bean bean = new Bean(); bean.setDependency(hiddenBean()); return bean; } @Bean protected Bean hiddenBean() { return new Bean("protected bean"); } } 

然后,您可以@Autowire Bean类,它将自动assemblypublic bean(无需抱怨多个匹配的bean)

作为类的定义(除非嵌入)不允许private / protected访问器,解决方法是使用@Configuration类来实例化所有bean,发布公共bean同时隐藏私有/受保护(而不是直接注释classes @Component \ @Service

包保护访问器也值得尝试隐藏@Component注释类。 我不知道这是否有效。