Как проверить, зависит ли класс от CDI для создания экземпляра? - PullRequest
0 голосов
/ 22 апреля 2020

Как проверить, нуждается ли класс в инъекции CDI для создания экземпляра?

Например,

public class Foo {

    @Inject
    private Bar bar;

    // constructor/setter method can have @Inject
}

Если класс зависит от CDI, но CDI недоступен, экземпляры создавать не следует. Существует ли стандартный API-интерфейс CDI для проверки, зависит ли класс от CDI?

В этом случае пользователь может зарегистрировать классы слушателей. Если класс слушателя зависит от CDI, но CDI недоступен, слушатель будет игнорироваться.

1 Ответ

0 голосов
/ 22 апреля 2020

Я скоро отвечу на ваш вопрос, но часть внедрения зависимости заключается в том, что аннотации (например, @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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...