java - 从注入(inject)的实例 CDI 获取准确的对象

标签 java dependency-injection cdi

我有一些 DAO,例如 UserDAO、ProductDAO 等,没有 cdi 注释或限定符(那么它们是 @Default)。这些类实现抽象 DAO:

public interface DAO {
    void update();
    void delete();
    void getById(long id);
}

所以我收到了所有可用的 DAO 实现:

public class ClassToInjectIn {
    @Inject
    private Instance<DAO> allDAOs;
}

现在 allDAOs 包含以下内容:

[UserDAO, {@Default(), @Any()}]
[ProductDAO, {@Default(), @Any()}]

例如,我需要从此实例获取 UserDAO,但我不能。 我想这样做:

UserDAO user = allDAOs.get();

但它抛出异常:

Exception in thread "main" javax.enterprise.inject.AmbiguousResolutionException: Too many beans match, because they all have equal precedence.

所以问题是我无法使用大量限定符,因为我有很多实体并且可以稍后添加它们。我需要一种通用方法,可以找到并提取具有请求类型的对象,如上面的示例所示。并且它不应该使用类名或任何字符串名称来指示所需的类型或类。例如。 public DAO getNeededDAO(String neededClassName)。它必须动态检测所需的类型/类。可以吗?

更新

我正是需要这个:

UserDAO user = chooseAndGetRequiredDAO();

因此,chooseAndGetRequiredDAO() 必须了解 UserDAO 类型是必需的。它必须查找现有的 DAO,如果找到则选择 UserDAO。也许它应该使用反射或任何 DAO 工厂,我不确定。

最佳答案

您的 allDAOs 字段允许您执行 programmatic lookup在其类型集中具有 DAO 类型的所有 bean 上。 但要进行查找,您必须发出搜索请求。在这种特殊情况下,类型和限定符的组合。

UserDAO user = allDAOs.select(UserDao.class).get();

关于java - 从注入(inject)的实例 CDI 获取准确的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556008/

相关文章:

java - 为什么spring boot在打包时(使用gradle)不加载应用程序yml?

java - 比较器 : Equals method functionality

java - 重置 Weld 的廉价方法?

hibernate - 在tomcat中使用生产者注入(inject)EntityManager

java - 嵌套同步 map

java - 通过访问 2 个 .csv 文件中的数据来创建条形图

java - 如何在 Android Studio 的 Java 库模块中使用 Dagger?

java - 是否可以使用 Guice 限制类型层次结构扫描?

python - 关于FastAPI的依赖注入(inject)及其可重用性的问题

jakarta-ee - 如何在运行时选择要注入(inject)的bean