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: целевой набор)
Я надеюсь, что это будет полезно и другим.