【问题标题】:CDI Bean Scoping during Injection is not working注入期间的 CDI Bean 作用域不起作用
【发布时间】:2016-02-26 08:18:20
【问题描述】:

我想在注入期间为 CDI 中的 pojo bean 提供移动范围。

我创建了一个普通的 bean,并在 @javax.faces.bean.ViewScoped 托管 Bean 中注入了与 @javax.enterprise.context.ApplicationScoped 相同的内容,如下所示:

@Inject
@ApplicationScoped
Pojo pojo;

// POJO类

Class Pojo {
  private String var;

  public Pojo() {

  }

  public String getVar() {
    return var;
  }

  public void setVar(String var) {
    this.var = var;
  }
}

当我使用相同的语法注入时,Pojo bean 的填充值无法在新视图 bean 中恢复。

但是当我在类声明中使用 @ApplicationScoped 时,它会起作用,然后是非作用域注入,如下所示:

@ApplicationScoped
Class Pojo {
      private String var;

注入:

@Inject
Pojo pojo;

当我制作制作人和限定符时,前一种情况得到了解决,但我觉得这将是我不应该做的开销。作为 CDI 的新手,我想问一下我在这里真正缺少什么。

【问题讨论】:

    标签: jsf cdi


    【解决方案1】:

    范围和上下文管理是 CDI 中一个非常强大的功能。它也是组件业务逻辑的一部分(@ApplicationScoped bean 的开发方式与@RequestScoped 不同),这就是为什么作用域链接到 bean 定义的原因。 注入点只是您使用 bean 的地方,而不是您定义它的地方,因此无法在规范级别在注入点定义 bean 的范围。 现在,如果您真的想使用此功能,您可以开发一个便携式扩展来添加这种可能性。但是您可能还必须在限定符系统上工作,因为在 bean 解析过程中不使用范围(即,如果它们没有特定的注入点,则在不同范围内具有相同类型的 2 个 bean 将发生冲突)限定符)。

    【讨论】:

    • 可以理解。我一直想知道为什么在 CDI 中不能有一个在注入期间可以有任何范围的中性可注入 bean。我认为要在不同的范围内实现这一点,我还需要针对不同的范围修改我当前的扩展(限定符和生产者)或新的扩展。
    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 2012-07-29
    • 2018-10-26
    • 2015-06-13
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多