我有一个豆子有:
void initialize()
用@PostConstruct
注释的方法。void release()
用@PreDestroy
注释的方法。- 其他一些方法。
- 此外,Bean 还有一个定义一些拦截器的
@Interceptors
注释。
其中一个拦截器具有注释的方法
@AroundConstruct
@AroundInvoke
@AroundTimeout
@PostConstruct
@PreDestroy
在每种方法中,我都放置了一些日志记录,因此我可以看到何时调用了拦截器方法。调用顺序如下所示:
- 输入拦截器的
@AroundConstruct
方法。 调用上下文:目标为null
,方法null
,构造函数设置。 - 调用 Bean 构造函数。
- 调用通过侦听器的
@AroundConstruct
方法存在。 调用上下文:目标是 Bean 实例,方法是null
的,构造函数是设置的。 - 拦截器的
@PostConstruct
方法被调用,调用 continue(( 并返回。 调用上下文:目标是 Bean 实例,方法null
,构造函数被设置。 - 在上一个调用完全返回后,调用 Bean 的
@PostConstruct
方法。
我非常惊讶地意识到@PostConstruct
不是在 Bean 的@PostConstruct
方法调用期间调用的,而是在 Bean 的构造和调用 Bean 的@PostConstruct
方法之间调用的。此外,Bean 的@PostConstruct
方法的调用根本不被拦截,不是通过拦截器的@PostConstruct
方法,也不是通过其@AroundInvoke
方法
。我这边/我的程序方面有什么错误吗?
有没有办法拦截 bean 的@PostConstruct
方法(@PreDestroy
方法也是如此(?
我需要准备上下文并用一些内容填充它们。此外,对于调用堆栈深处的其他方法来说,以后知道调用是由容器通过这两种方法之一触发的,也会很好。
由于我在互联网上找不到任何答案,我进行了一些调试并发现了以下内容(使用WildFly 15.0.1.Final(:
当 Bean 实例化时:
- 输入侦听器的
@AroundConstruct
(调用上下文:构造函数集( - 执行 Bean 的构造函数
- 离开拦截器的
@AroundConstruct
(调用上下文:构造函数和目标集( - 输入拦截器的
@PostConstruct
(调用上下文:构造函数和目标集( - 执行 Bean 的
@PostConstruct
- 离开拦截器的
@PostConstruct
(调用上下文:构造函数和目标集(
这意味着你不知道调用了哪个方法,你只知道调用了 bean 的@PostConstruct
方法。我想这是因为 bean 的@PostConstruct
方法是作为某种拦截器执行的,但这只是我这边的一个假设。
执行 Bean 的方法时:
- 输入拦截器的
@AroundInvoke
(调用上下文:方法和目标集( - 执行 Bean 的方法
- 离开拦截器的
@AroundInvoke
(调用上下文:方法和目标集(
当豆子被销毁时:
- 输入侦听器的
@PreDestroy
(调用上下文:目标集( - 执行 Bean 的
@PreDestroy
- 离开拦截器的
@PreDestroy
(调用上下文:目标集(
我希望这也对其他人有所帮助。