2015-01-21 99 views
10

我使用@ComponentScan@Component来定义我的弹簧豆。我想要宣布其中的一个豆子是autowire-candidate=false如何在使用注释时声明Spring bean autowire-candidate =“false”?

这可以用xml中的这个属性来完成。注释中没有相应的内容吗?

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

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

感谢

+2

用'@ Primary'注释首选的一个。不需要这样使用'@ Qualifier'。 – 2015-01-21 11:38:10

+0

感谢您的评论。是的,这实际上是我找到的解决问题的方法之一,但我只是想知道如何在注释中没有相当于autowire候选人。 – 2015-01-21 12:18:57

+2

看起来像Spring拒绝'autowire-candidate = false'的概念,它不再支持。没有注释的模拟,所以'@ Primary'只有你注意到的方法。 – 2016-10-12 03:10:20

回答

5

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

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

0

您也可以使用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"); 
    } 
} 

然后,您可以@AutowireBean类,它会自动装配的public豆(不抱怨多个匹配豆)

作为一类的定义(除非嵌入式)不允许private/protected访问者的工作是使用一个@Configuration类,将实例化所有的豆子的同时隐藏私有/保护(而不是直接标注类@Component \ @Service

还包保护访问可以值得一试隐藏发布公开豆@Component带注释的类。我不知道这是否可行。

相关问题