使用@Produces 注释时存在不明确的依赖关系

Ambiguous dependency while using @Produces annotation

我一直在研究来自here的CDI依赖注入的@Produces注解。我刚刚创建了自己的相同示例。但是,我面临着模棱两可的依赖。

public interface Bank {

    public void withdrawal();
    public void deposit();
}

public class BankOfAmerica implements Bank {

    @Override
    public void withdrawal() {
        System.out.println("Withdrawal from Bank of America");
    }

    @Override
    public void deposit() {
        System.out.println("Deposit to Bank of America");
    }
}

public class BankFactory {

    @Produces
    public Bank createBank() {
        return new BankOfAmerica();
    }
}

这是 class 注入的 bean。

public class ProducesExample {

    @Inject
    private Bank bankOfAmerica;

    public void callBanksWithdrawal() {
        bankOfAmerica.withdrawal();
    }
}

感谢您的帮助。

编辑:我知道这是 question 的一种副本。但是,在我分享的教程中,它说它应该可以工作。此外,只有一种类型的 bean,因此无需使用 @Default 或 @Alternatives,但仍然对为什么它不起作用感到困惑。

本教程有点模棱两可(双关语意),其中 类 应该在每个步骤中同时部署,所以我不会太担心。

您链接的其他问题的答案与您的情况相符。 BankOfAmerica 是类型 Bank 的 bean(在 CDI 1.0 或 CDI 1.1+ 中带有显式 bean),而您的生产者方法是另一个相同类型的 bean,因此解析不明确。

您的 beans.xml 文件可能会有帮助。

如果你想要一个工厂(使用@produces)你不能有bean-discovery-mode="all"。如果您有 all 选项,那么您将获得 Ambiguous dependencies 异常,因为您的所有实现都将被自动扫描为可能的依赖项(我认为这是一个糟糕的性能选项)。

所以设置 bean-discovery-mode="annotated" ,让你的实现 cdi-annotation 自由,并在工厂中使用 @Dependent 并在构建方法中使用 @produces。

您必须像这样添加 @BankProducer 注释:

public class BankFactory {

    @Produces
    @BankProducer
    public Bank createBank() {
        return new BankOfAmerica();
    } 

}