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



我一直在研究@Produces从这里开始的CDI依赖注入的注释。我刚刚创建了自己的相同示例。但是,我面临着模棱两可的依赖性。

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();
    }
}

这就是 bean 被注入的类。

public class ProducesExample {
    @Inject
    private Bank bankOfAmerica;
    public void callBanksWithdrawal() {
        bankOfAmerica.withdrawal();
    }
}

我感谢任何帮助。

编辑:我知道这是这个问题的一种重复。但是,在我分享的教程中,它说它应该可以工作。此外,只有一种类型的豆子,所以不需要使用@Default或@Alternatives但仍然对它为什么不起作用感到困惑。

本教程对于

每个步骤中应同时部署哪些类有点模棱两可(双关语),所以我不会太担心。

您链接的另一个问题的答案确实符合您的情况。 BankOfAmericaBank 类型的 Bean(在 CDI 1.0 或 CDI 1.1+ 中使用显式 bean),而您的生产者方法是另一个相同类型的 bean,因此分辨率不明确。

有一件事很有帮助,那就是你的 bean.xml 文件。

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

所以把 bean-discovery-mode="annotated" ,让你的实现 cdi 注释免费,并在工厂中使用@Dependent,在构建方法中使用@produces。

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

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

}

最新更新