如何检查类是否需要CDI注入来创建实例?
例如,
public class Foo {
@Inject
private Bar bar;
// constructor/setter method can have @Inject
}
如果类依赖于CDI,但CDI不可用,则不应创建任何实例。是否有标准的CDI API来检查类是否依赖于CDI?
用例是用户可以注册侦听器类。如果侦听器类依赖于CDI,但CDI不可用,则该侦听器将被忽略。
我将很快回答您的问题,但是依赖项注入的部分原因是注释(例如@Inject
)不应影响类的设计。
如果您有这样的课程:
public class Foo {
private final Bar bar;
@Inject
public Foo(final Bar bar) {
super();
this.bar = bar;
}
}
…然后you创建Foo
或CDI创建Foo
,对创建Foo
的方式没有影响。在两种情况下都使用相同的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
}