CDI注入具有参数化构造函数的Bean

时间:2015-03-23 09:45:00

标签: cdi

我有一个类A,它类似于B类的包装,只是为了B Serializable。现在我有了一个类C,我需要在其中注入类A,以便使用属性' a'进行实例化。和' b'。如何实现这一目标?

以下是我的代码:

 Class A extends B {
 public A(int a, int b){
   super(a,b);
 } 


  class C{
   @Inject 
    A objA; //will not work
 }

2 个答案:

答案 0 :(得分:1)

通常,它是一种很好的设计实践,不通过构造函数为注射服务传递数据。尽可能使您的服务成为无国籍和可重复使用。

如果那不可能,你可以在这里检查CDI生成器语义:Using producer methods and Fields

答案 1 :(得分:0)

我认为我同意maress,因为你可能做了一些根本错误的事情,但是如果没有你的整个用例,我会提供以下内容:

你的A类,因为它不是CDI bean,所以不能注入C语言。要成为CDI bean,它必须具有no-arg构造函数或使用@Inject注释的构造函数。

在这种情况下,即使使用@Inject注释构造函数:

@Inject
public A(int a, int b) { ... }

你仍然无法将A注入C.问题是有许多方法来满足该构造函数。容器不会知道你想要注入哪些。也就是说,您是否希望它实例化A(0,0)或A(1,2)或A(-12,5001)或......?

您有几个选择。您可以使用限定符(例如@Named)来消除您要注入的特定整数的歧义:

@Inject
public A(@Named("int1") int a, @Named("int2") int b) {...}

合格的int可以通过生产者方法生成:

@Produces @Named("int1")
public int get_int1() { return 5; }

@Produces @Named("int2")
public int get_int2() { return 6; }

或者,您可以使用producer方法生成A:

的实例
@Produces
public A get_A() { return new A(5,6); }