我正在使用@ComponentScan
和@Component
来定义我的春豆。我想要的是将这些bean中的一个声明为autowire-candidate=false
。
这可以在xml中使用此属性来完成。是不是注释中的等价物?
我想要这个的原因是因为我有2个相同接口的实现,我不想使用@Qualifier
。
编辑:使用@Primary是一个有效的解决方法,但autowire-candidate在我看来似乎是一个有用的功能,有自己的语义。
由于
答案 0 :(得分:9)
看起来Spring拒绝autowire-candidate=false
概念并且不再支持它。没有带注释的模拟,所以@Primary
是你注意到的最好的解决方法。
另一种方法是使用org.springframework.beans.factory.support.AutowireCandidateResolver
中使用的自定义DefaultListableBeanFactory
,其逻辑可以从自动线候选中排除不需要的bean。在这种情况下,该技术将类似于autowire-candidate=false
中SimpleAutowireCandidateResolver
使用的技术。
答案 1 :(得分:2)
从Spring 5.1开始,您可以通过autowire-candidate
属性在@Bean
中配置autowireCandidate
:
@Bean(autowireCandidate = false)
public FooBean foo() {
return newFooBean();
}
答案 2 :(得分:1)
您还可以使用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
类,它会自动装配 public
bean(不会抱怨多个匹配的bean)
作为一个班级'定义(除非嵌入)不允许 private
/ protected
访问者,解决方法是使用@Configuration
类实例化所有bean,同时隐藏私有/受保护的公共bean(而不是直接注释类@Component
\ @Service
)
同样受包保护的访问者可能值得尝试隐藏@Component
带注释的类。我不知道这是否有效。