使用CDI注入数据访问对象

时间:2013-01-28 13:28:45

标签: dependency-injection dao cdi domain-model

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

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

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

例如,假设我有以下课程

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

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

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

2 个答案:

答案 0 :(得分:1)

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

这是实现自己的制作人的一个很好的例子:

Depedency inject request parameter with CDI and JSF2

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

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

@Inject
String myString;

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

@Inject
@RequestParam
String myString;

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

现在说你有40个班级。然后生成它们会变得很混乱,并且您希望确保它被扫描。然后你编写自己的小扩展,观察CDI即将扫描并指示它扫描额外的罐子。这样的扩展可能很容易写,但我不知道细节,因为我没有写任何类似的扩展

答案 1 :(得分:0)

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