【问题标题】:How to check if a class depends on CDI for creating an instance?如何检查一个类是否依赖 CDI 来创建实例?
【发布时间】:2020-04-21 23:09:09
【问题描述】:

如何检查一个类是否需要 CDI 注入来创建实例?

例如,

public class Foo {

    @Inject
    private Bar bar;

    // constructor/setter method can have @Inject
}

如果一个类依赖于 CDI 但 CDI 不可用,则不应创建任何实例。是否有标准的 CDI api 来检查一个类是否依赖于 CDI?

用例是用户可以注册监听器类。如果某个监听器类依赖于 CDI 但 CDI 不可用,则该监听器将被忽略。

【问题讨论】:

    标签: java dependency-injection cdi


    【解决方案1】:

    我会很快回答你的问题,但依赖注入的部分要点是注释(例如@Inject)不应影响类设计。

    如果你有这样的课程:

    public class Foo {
      private final Bar bar;
      @Inject
      public Foo(final Bar bar) {
        super();
        this.bar = bar;
      }
    }
    

    ...那么无论是创建Foo还是CDI创建FooFoo的创建方式没有区别。两种情况都使用相同的 API(相同的构造函数)。

    当您谈论private 字段注入时,事情当然会变得有点奇怪,就像这样:

    public class Foo {
      @Inject
      private Bar bar;
      public Foo() {
        super();
      }
    }
    

    这是一个类,(如所写)如果不使用反射技巧就不可能创建它。当然,这正是 CDI 实现的作用。

    所以所有这一切都说明我猜你在问别的东西。我只是不确定那是什么。

    按照您的要求回答您的问题:

    确定给定 CDI 实现是否“知道”给定类的一种方法是做一些有点糟糕的事情,如下所示:

    final Instance<YourClass> yourClassInstances = CDI.current().select(YourClass.class);
    if (yourClassInstances.isUnsatisified()) {
      // CDI for whatever reason can't create a YourClass instance; maybe this is
      // sort of what you want?
    } else {
      // CDI "knows about" your class; actually trying to get an instance might
      // result in ambiguity
    }
    

    【讨论】:

    • 更新问题:用例是用户可以注册监听器类。如果侦听器类依赖于 CDI 但 CDI 不可用,则侦听器将被忽略。但是您的代码在类路径中需要 CDI 提供程序。
    • 嗯;一个不同的问题。这个问题的答案是:编写一个处理观察者方法的可移植扩展。如果 CDI 可用,它将被调用,如果不可用则不会。
    • 当CDI不可用时,仍然需要检查监听类是否依赖于CDI。忽略它或通过调用默认构造函数来实例化一个实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多