7

假设我有两个类,第一个类没有任何属性、字段或注释:

public class B {}

还有一个注入 B 的类,如下所示:

public class A {
    @Inject
    private B b;

    public B getB() {
        return b;
    }
}

现在 A 类在我们使用它之前是毫无用处的,所以有两种选择:

  • @注入它
  • 使用可靠的“new 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)。

4

1 回答 1

9

依赖注入虽然有用,但并不神奇。DI 的工作方式是,当您向容器请求对象的实例时,容器首先构造它(通过new()),然后设置依赖项(如何发生取决于您的框架)。

如果您自己构建实体,那么容器不知道您已经构建了实体并且无法设置实体的依赖关系。

如果您想使用工厂,那么大多数框架都有一些配置实体的方法,以便容器知道进行静态工厂方法调用而不是调用实体的构造函数。但是,您仍然必须从容器中获取您的实体。

编辑:这个站点似乎演示了如何在 CDI 中使用工厂。

于 2011-02-01T21:45:42.603 回答