具有构造函数参数的依赖注入
-
26-12-2019 - |
题
我有一个 EJB 如下:
public class Bar() {
private String s;
public Bar() {
this.s = "bar";
}
@Inject public Bar(String s) {
this.s = s;
}
}
我怎样才能通过使用 arg-构造函数 进入另一个
Foo
上课?然后,我定义
Foo
类为EJB,目的是执行 迪 为它到另一个类(例如,一个WebServlet)。我怎样才能注射一个Foo
类实例通过传递String
正确设置Bar
arg-构造函数 内在依赖?有没有更好的方法来定义
Bar
为了达到上面的点?
解决方案
带注释的构造函数注入告诉CDI,每当有人请求注入Bar的实例时,它应该使用标记为@Inject的构造函数。
然后CDI容器尝试获取所有必需构造函数参数的实例并失败,因为它无法处理"字符串"。它只是不知道你的意思是哪个字符串。
你必须通过使用生产者和限定符来帮助容器解决依赖关系,告诉他你想要什么字符串。我只是在这里给你最简单的解决方案:
public class Bar {
@Inject
public Bar(@Named("myString") String s) {
this.s = s;
}
}
然后是另一个类(不必是不同的类,但它更具可读性):
public class MyStringProducer {
@Produces
@Named("myString")
public String getMyString() {
return ...; // whatever you want ... read JSON, parse properties, randomize ...
}
}
其他提示
@Inject
只有在注射时才有效"managed
"对象。字符串不是一个托管对象,因此这是行不通的.
但是,下面的例子应该工作(我在这里使用了spring。根据您正在使用的库使用DIALIZATON代码):
@Named
public class Foo {
@Inject
Bar bar;
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
Foo foo = (Foo)ctx.getBean("foo");
System.out.println(foo.bar.getString());
}
}
@Named
public class Bar {
private String s;
public Bar() {
this.s = "bar";
}
@Inject
public Bar(Bar1 bar1) {
this.s = bar1.getS();
}
public String getString() {
return s;
}
}
@Named
class Bar1 {
private String s="bar1";
public String getS() {
return s;
}
}
不隶属于 StackOverflow