假设我有两个类,首先是没有任何属性,字段或注释的类:
public class B {}
一个得到B注入的类,如下所示:
public class A {
@Inject
private B b;
public B getB() {
return b;
}
}
现在A类在我们使用它之前是没用的,所以有两个选择:
如果注入A,CDI会对其进行管理并且足够注入具有@Dependent隐含范围的B。很酷,就是我想要的。
但是,如果我手动构造A(假设在工厂或构建器中),CDI完全忽略我的对象并且不会注入B类对象。
示例我在谈论它何时不起作用,这里对象a将始终保持为空:
public class Builder {
@Inject
private A a;
public static Builder ofTypeSomething() {
// do some magic here
return new Builder();
}
private Builder() {
// and some more here
}
}
为什么这不起作用?
A类是一个有效的托管bean,并且有一个有效的范围,就像B类一样。即使我将@Producer添加到静态方法,它也不会改变任何东西(这很好,导致静态方法的想法)是调用它,而不是在任何地方注入Builder。)
答案 0 :(得分:9)
依赖注入虽然有用但并不神奇。 DI的工作方式是当你向容器询问一个对象的实例时,容器首先构造它(通过new()
)然后设置依赖关系(这是如何发生取决于你的框架)。
如果您自己构造实体,那么容器不知道您构造了实体,并且无法设置实体的依赖关系。
如果您想使用工厂,那么大多数框架都有一些配置实体的方法,以便容器知道进行静态工厂方法调用而不调用实体的构造函数。但是,您仍然必须从容器中获取实体。
编辑:This site似乎演示了如何在CDI中使用工厂。