1

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

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

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

例如,假设我有以下课程

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

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

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

4

2 回答 2

1

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

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

使用 CDI 和 JSF2 的依赖注入请求参数

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

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

@Inject
String myString;

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

@Inject
@RequestParam
String myString;

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

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

于 2013-02-05T15:15:47.253 回答
0

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

于 2013-01-29T15:27:18.427 回答