如何声明一个Spring bean autowire-candidate =" false"使用注释时?

时间:2015-01-21 11:21:52

标签: java spring spring-annotations

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

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

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

编辑:使用@Primary是一个有效的解决方法,但autowire-candidate在我看来似乎是一个有用的功能,有自己的语义。

由于

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

从Spring 5.1开始,您可以通过autowire-candidate属性在@Bean中配置autowireCandidate

@Bean(autowireCandidate = false)
public FooBean foo() {
      return newFooBean();
}

答案 2 :(得分:1)

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

请参阅Bean visibility

@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带注释的类。我不知道这是否有效。