我一直在研究qzxswpoi的CDP依赖注入的@Produces注释。我刚刚创建了自己的相同示例。但是,我面临着模棱两可的依赖。
here
这是bean注入的类。
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();
}
}
我感谢任何帮助。
编辑:我知道这是public class ProducesExample {
@Inject
private Bank bankOfAmerica;
public void callBanksWithdrawal() {
bankOfAmerica.withdrawal();
}
}
的一种副本。但是,在我分享的教程中,它说应该可以工作。此外,只有一种类型的bean,所以不需要使用@Default或@Alternatives,但仍然对它为什么不起作用感到困惑。
本教程有点含糊不清(双关语)关于哪些类应该在每个步骤中同时部署,所以我不会太担心。
您链接的其他问题的答案与您的案例相符。 question是BankOfAmerica
类型的bean(在CDI 1.0或CDI 1.1+中使用显式bean),并且您的producer方法是另一个相同类型的bean,因此模糊分辨率。
可能有用的一件事是您的beans.xml文件。
如果你想拥有一个工厂(使用@produces),你就不能拥有bean-discovery-mode =“all”。如果您拥有all选项,那么您将获得不明确的依赖项异常,因此所有实现都将被自动扫描为可能的依赖项(在我看来,这是一个糟糕的性能选项)。
所以把bean-discovery-mode =“annotated”,让你的实现cdi-annotation自由,并在工厂使用@Dependent,在build方法中使用@produces。
你必须像这样添加@BankProducer注释:
Bank
}