JEE: Как перехватить метод @PostCostruct?

У меня есть фасоль, имеющая:

  • void initialize() метод, аннотированный @PostConstruct.
  • void release() метод, аннотированный @PreDestroy.
  • Некоторые другие методы.
  • Кроме того, у этого боба есть @Interceptors аннотация, определяющая некоторые перехватчики.

Один из этих перехватчиков имеет методы, помеченные

  • @AroundConstruct
  • @AroundInvoke
  • @AroundTimeout
  • @PostConstruct
  • @PreDestroy

В каждый из этих методов я помещаю логирование, чтобы видеть, какие и когда вызываются методы перехватчика. И порядок звонков выглядит так:

  • Перехватчик @AroundConstructметод введен. InvocationContext: цельnull, метод null, конструктор установлен.
  • Вызывается конструктор бинов.
  • Звонок существует через перехватчик @AroundConstructметод. InvocationContext: Target - это экземпляр компонента, метод -null, конструктор установлен.
  • Перехватчик @PostConstructвызывается метод, вызывает continue () и возвращается. InvocationContext: Target - это экземпляр компонента, метод -null, конструктор установлен.
  • После предыдущего вызова полностью вернул компонент @PostConstruct вызывается метод.

Я был очень удивлен, узнав, что @PostConstruct не вызывается во время фасоли @PostConstruct вызов метода, но между созданием bean-компонента и вызовом bean-компонента @PostConstructметод. Также зов бобов@PostConstruct метод вообще не перехватывается, ни перехватчик @PostConstruct метод ни би его @AroundInvoke метод.

Есть ли ошибка на моей стороне / стороне моих программ?

Есть ли способ перехватить боб @PostConstruct метод (то же самое касается @PreDestroy метод)?

Мне нужно подготовить контекст (ы) и наполнить их содержанием. Вдобавок было бы неплохо, если бы другой метод в глубине стека вызовов позже узнал, что вызов был инициирован контейнером через один из этих двух методов.

1 ответ

Поскольку я не смог найти ответа на этот вопрос в Интернете, я провел небольшую отладку и обнаружил следующее (использовал WildFly 15.0.1.Final):

Когда создается экземпляр bean-компонента:

  • Входящий перехватчик @AroundConstruct (InvocationContext: набор конструкторов)
  • Выполнение конструктора bean-компонента
  • Оставляя перехватчик @AroundConstruct (InvocationContext: Конструктор и целевой набор)
  • Входящий перехватчик @PostConstruct (InvocationContext: Конструктор и целевой набор)
  • Выполнение bean's @PostConstruct
  • Оставляя перехватчик @PostConstruct (InvocationContext: Конструктор и целевой набор)

Это означает, что вы не знаете, какой метод вызывается, вы знаете только, что @PostConstructназывается метод bean-компонента. Я думаю, это потому, что@PostConstruct Метод bean-компонента выполняется как своего рода перехватчик, но это только мое предположение.

Когда вы выполняете метод bean-компонента:

  • Входящий перехватчик @AroundInvoke (InvocationContext: метод и целевой набор)
  • Выполнение метода bean-компонента
  • Оставляя перехватчик @AroundInvoke (InvocationContext: метод и целевой набор)

Когда боб уничтожен:

  • Входящий перехватчик @PreDestroy (InvocationContext: целевой набор)
  • Выполнение bean's @PreDestroy
  • Оставляя перехватчик @PreDestroy (InvocationContext: целевой набор)

Я надеюсь, что это будет полезно и другим.

Другие вопросы по тегам