【问题标题】:Using CDI to inject a Data Access Object使用 CDI 注入数据访问对象
【发布时间】:2013-01-28 13:28:44
【问题描述】:

假设我已经编写了一个数据访问对象,我希望能够使用 CDI 将其注入到服务类中。此外,我有该 DAO 的两个实现。

我对 CDI 的理解是,我必须注释我的 DAO 实现类,以便 CDI 知道要注入哪个实现。

问题是,DAO 位于 .jar 文件中。通过使用 CDI 注释对其进行注释,我在非 JavaEE 类中使用了 JavaEE 导入。

例如,假设我有以下课程

public class BusinessService {
    @Inject @SomeMybatisQualifier AccountDAO accountDao;
    ...
}

@Inject 注解来自 javax.inject.Inject。现在,这个服务类依赖于 JavaEE 环境。

有人可以向我解释我缺少什么吗?如何将非注释类注入另一个非注释类?这对于 Spring 来说相当简单。

【问题讨论】:

    标签: dependency-injection dao cdi domain-model


    【解决方案1】:

    如果有足够的课程,我同意 LightGuard。但是对于一对夫妇,为什么不直接使用@Produces 制作它们呢?

    这是实现您自己的生产者的一个不错的示例:

    Depedency inject request parameter with CDI and JSF2

    你应该可以写 return new MyObject();你可以添加任何你想要的限定符

    不确定有什么不清楚的地方,但要点如下:CDI 要扫描 jar 中的 beans,它必须有 beans.xml。否则它不会被扫描,因此不能用于注入。字符串也不可用。如果你尝试注入一个字符串说;

    @Inject
    String myString;
    

    CDI 将不知道该给您什么,就像您的罐子一样。但我知道我想要什么字符串(请求参数),我也可以让 CDI 知道。如何?好吧,我为我的制作人提供了一个限定符 @RequestParam(再次参见示例),现在当我想在客户端代码中使用它时,我会这样做:

    @Inject
    @RequestParam
    String myString;
    

    你可以做同样的事情。有一个生产者,只需创建一个你需要的新实例,然后返回它。现在 CDI 将知道如何依赖注入特定的 bean。

    现在假设您有 40 个课程。然后生成它们会变得很乱,你想确保它被扫描。然后编写自己的小扩展,观察 CDI 何时扫描并指示它扫描其他 jar。这样的扩展可能很容易写,但我不知道细节,因为我没有写过类似的扩展

    【讨论】:

    • 我不得不说,到目前为止,我仍然对这两个答案感到非常困惑,但这似乎更符合我想要完成的目标。
    【解决方案2】:

    到目前为止,最简单的方法是创建一个 CDI 扩展以在 jar 中添加类(因为该 jar 中没有 beans.xml,因此 CDI 不会拾取它)并向元数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多