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

时间:2015-01-28 06:38:09

标签: java java-ee dependency-injection cdi jboss-weld

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

这是注入bean的类。

public class ProducesExample {

    @Inject
    private Bank bankOfAmerica;

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

我感谢任何帮助。

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

3 个答案:

答案 0 :(得分:1)

本教程有点含糊不清(双关语)关于哪些类应该在每一步中同时部署,所以我不会太担心。

您链接的其他问题的答案与您的案例相符。 BankOfAmerica是一个类型为Bank的bean(在CDI 1.0或CDI 1.1+中,带有显式bean),而你的生成器方法是另一个相同类型的bean,因此模糊分辨率。

答案 1 :(得分:0)

有一件事可以帮到你的beans.xml文件。

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

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

答案 2 :(得分:0)

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

public class BankFactory {

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

}