我有一个类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
}
答案 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); }