@Produces не возвращает cdi proxy, но реальный экземпляр - PullRequest
0 голосов
/ 07 мая 2019

У меня есть класс

@RequestScoped
public class AFactory {

  private final HttpServletRequest request;

  protected AFactory () {
    this.request = null;
  }

  @Inject
  public AFactory (HttpServletRequest request) {
    this.request = request;
  }

  @Produces
  public A getA() {
    int random = ...;
    A a = new A(request);
    a.setRandom(random);
    return a;
  }

}

Я понимаю, так как я делаю новый A (), я возвращаю реальный экземпляр.

Это ожидаемый способ использования производителей?

Есть ли способ вернуть проксированный экземпляр?

1 Ответ

3 голосов
/ 08 мая 2019

CDI устанавливает прокси для bean-компонентов всех областей, кроме псевдоскопа @Dependent .@Produces аннотированный метод (короткий продюсер ) вызывается CDI всякий раз, когда ему нужно получить (новый) экземпляр компонента.Этот экземпляр затем помещается в некоторый пул для соответствующей области.

Прокси всегда будет возвращать экземпляр компонента из пула.Попробуйте добавить какое-либо сообщение отладки в метод источника, чтобы увидеть, как часто оно будет вызываться.Производитель для компонента @ApplicationScoped должен вызываться только один раз, а производитель @RequestScoped должен вызываться один раз за запрос.

В вышеприведенных примерах область применения метода производителя не предоставляется (область действияфабричный класс не используется для метода производителя), поэтому будет использоваться область по умолчанию (@Dependent).И это означает (поскольку для этой области не используется прокси-сервер), новый экземпляр будет внедрен каждый раз, когда CDI обнаружит @Inject A.См. Также Вопрос и ответ и соответствующую документацию для получения более подробной информации.

Итак, к вашим конкретным вопросам:

  • Ожидаемое поведение ожидается
  • Прокси будут использоваться, только если область не @Dependet, которая является значением по умолчанию.
...