如何在使用注释时声明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=false
的SimpleAutowireCandidateResolver
。
您还可以使用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
注释类。 我不知道这是否有效。