【问题标题】:CDI in Java EE - which Java classes cannot be injected?Java EE 中的 CDI - 哪些 Java 类不能注入?
【发布时间】:2014-01-22 10:21:56
【问题描述】:

我正在浏览 Oracle Java EE 6 Tutorial 并在“作为可注入对象的 Beans”部分下,它说

可以注入以下几种对象:

(几乎)任何 Java 类

会话 bean ......

什么是无法注入的 Java 类的示例?他们只是提到了一些理论上的技术限制,还是对可以注入的类有已知的限制?

【问题讨论】:

  • 这可能不是你不能注入哪些类的问题,它更多的是你不应该注入哪些类的问题。答案是由上下文决定的。例如,想要将 EntityManager 注入到 JPA 实体类中,这不是太聪明。

标签: java jakarta-ee cdi


【解决方案1】:

来自spec,频道。 2.2.1:

几乎任何 Java 类型都可能是 bean 的 bean 类型:

  • bean 类型可以是接口、具体类或抽象类,并且可以声明为 final 或具有 final 方法。
  • bean 类型可以是具有实际类型参数和类型变量的参数化类型。
  • bean 类型可以是数组类型。仅当元素类型相同时,两个数组类型才被视为相同。
  • bean 类型可以是原始类型。原始类型被认为与其对应的包装器相同 java.lang 中的类型。
  • bean 类型可能是原始类型。

类型变量不是合法的 bean 类型。包含通配符类型参数的参数化类型不是合法的 bean 输入。

请注意,在第 5.4.1 节“不可代理的 bean 类型”中为具有正常范围的 bean 指定了某些附加限制,如第 6.3 节“正常范围和伪范围”中所定义。

然后是引用的部分:

容器不能代理某些合法的 bean 类型:

  • 没有无参数的非私有构造函数的类,
  • 声明为 final 或具有 final 方法的类,
  • 原始类型,
  • 和数组类型。

总结一下:任何 Java 类型(包括接口、抽象类)都可以是 CDI bean,除非它是“正常范围的”并且至少满足以下条件之一:

  • 没有无参数的非私有构造函数
  • 是最终的/有最终的方法
  • 是原始的(intdouble 等)或数组

普通范围(例如@Application-@Session-@RequestScoped)意味着它需要被容器代理,因此上述限制可以用“不可代理”代替。 @Dependent@javax.inject.Singleton 不是普通作用域,它们是伪作用域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2014-04-27
    • 2015-07-29
    相关资源
    最近更新 更多