使用@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();
}
}
我一直在研究来自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();
}
}