Я скоро отвечу на ваш вопрос, но часть внедрения зависимости заключается в том, что аннотации (например, @Inject
) не должны влиять на дизайн класса.
Если у вас есть такой класс, как этот :
public class Foo {
private final Bar bar;
@Inject
public Foo(final Bar bar) {
super();
this.bar = bar;
}
}
… тогда, если вы создаете 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
}