【问题标题】:usage of cdi's in a ejb project without jsf在没有 jsf 的 ejb 项目中使用 cdi
【发布时间】:2017-01-26 06:54:34
【问题描述】:

我正在学习 javaEE,并且我在某处读到过有关 cdi 的主要用法的信息,当时首先是在带有 @requestscope、@applicationscope 等注释的 jsf 托管 bean 中。现在在较新的 javaEE 版本中,cdi 随处可用(甚至在 ejb bean 中)所以问题是,我如何注释一个应该注入到我的本地无状态 ejb 中的类?我问这个是因为 @RequestScope 之类的注释和所有这些都来自 jsf,但我没有使用 jsf。 @Default 是否足够,因为它仍然被标记为默认值? @Dependent 是更好的选择吗?

@Stateless
public class FooEjb{
@Inject Bar b;
}

// what annotation to put here?
public class Bar {
...
}

【问题讨论】:

    标签: java jakarta-ee ejb cdi


    【解决方案1】:

    是的,您不需要 JSF 在 JavaEE 中使用 CDI。

    如果您在不使用 JSF 的情况下使用 CDI,请使用 javax.enterprise.context 包中的范围注释。

    @Default 是一个qualifier,顾名思义就是默认限定符。如果你的容器中有同一个类的多个实现/实例,那么你可以使用限定符来区分。

    @Dependentscope,这是默认范围。这意味着它将取决于注入它的类的范围。每次创建注入它的类的新实例时,都会注入一个 @Dependent 类的新实例。

    要启用 CDI,您需要将 beans.xml 文件放在 Web 项目的 WEB-INF 目录或 EAR 或 EJB 项目的 META-INF 目录中。

    【讨论】:

    • 这意味着每个 bean 都自动是 '@Default' 和 '@Dependent'?如果我的 bean 有 3 个不同的 impl,那么 '@Default' 将有 3 次,因此我应该使用 '@Alternative',对吗?
    • @devhedgehog:是的,容器中的每个 bean 都是 @Default@Dependent,除非另有声明。如果您有两个实现,那么@Alternative 就可以了,但是对于两个以上的实现,您可以编写自己的@Qualifiersdzone.com/articles/define-cdi-qualifier
    • 好的,到目前为止我明白了。现在的问题是如何在不使用“@EJB”的情况下注入 ejb 无状态类?
    • 如果是本地接口,直接@Inject即可。
    【解决方案2】:

    根据java ee documentation,您的情况不需要注释。一个简单的 POJO 是一个可注入的 bean,并接收 @Default 注释。无需使用 JSF。

    【讨论】:

    • 我猜这些 pojos 默认市场是“@Default”和“@Dependent”还是我错了?
    • 好吧,到目前为止很清楚,但现在的问题是如何在不使用“@EJB”注释的情况下注入无状态 ejb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2015-08-17
    • 2020-08-22
    • 1970-01-01
    • 2018-05-26
    • 2019-09-08
    • 2012-10-05
    相关资源
    最近更新 更多