【问题标题】:Autowiring hierarchical beans自动装配分层bean
【发布时间】:2012-10-24 21:32:41
【问题描述】:

这是我的场景。我有两个类 ClassAClassBClassB 继承 ClassA
我在它们两个上都使用了@Component 注释来使它们成为Spring bean。

@Component
public class ClassA{
    // parent
}

@Component
public class ClassB extends ClassA{
    // child
}

public class ClassC{

    @Autowired
    private ClassA classA;

    public void doSomething(){

    }
}

现在,每当我尝试在 ClassC 中使用 @autowired 注释来注入 ClassA 时,如上所示,我得到以下异常。

没有定义类型 [ClassA] 的唯一 bean:预期的单个匹配 bean 但找到了 2:[classA, classB]

我知道当按类型自动装配时,spring 会找到两个可分配给 ClassA 的 bean,因此它会引发异常。

除了使用@Qualifier 注释和按名称自动连接之外,还有什么简单的方法可以解决这个问题吗?

我可以指示 spring 不仅检查可按类型分配的 bean,而且检查它是否是完全相同的类类型?

【问题讨论】:

    标签: spring


    【解决方案1】:

    是的,使用@Primary 注释。

    如果这不可行并且您不想使用@Qualifier,那么您将不得不手动解决它。比如:

    @Autowired
    private List<ClassA> candidates;
    
    private ClassA actual;
    
    @PostConstruct
    public void postConstruct() {
        for (ClassA candidate : candidates) {
            if (AopProxyUtils.ultimateTargetClass(candidate).equals(ClassA.class)) {
                actual = candidate;
                break;
            }
        }
        org.springframework.util.Assert.notNull(actual , "No bean of exact type ClassA found.");
    }
    

    【讨论】:

    • 对不起,我在完成之前不小心提交了我的评论。对于我提出的问题,使用 Primary annotation 是正确的答案。不幸的是,就我而言,ClassA 和 ClassB 是 JPA 数据存储库,而 Primary 注释似乎对它们不起作用。相反,我决定使用自定义限定符,它就像一个魅力。 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2021-09-02
    • 2021-03-22
    相关资源
    最近更新 更多