JEE:如何拦截@PostCostruct方法?



我有一个豆子有:

  • 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(调用上下文:目标集(

我希望这也对其他人有所帮助。

相关内容

  • 没有找到相关文章

最新更新