我有一个豆子:
void initialize()
用 注释的方法@PostConstruct
。void release()
用 注释的方法@PreDestroy
。- 其他一些方法。
- 此外,该 bean 具有
@Interceptors
定义一些拦截器的注释。
其中一个拦截器具有注释的方法
@AroundConstruct
@AroundInvoke
@AroundTimeout
@PostConstruct
@PreDestroy
在这些方法中的每一个中,我都添加了一些日志记录,因此我可以查看调用了哪些拦截器方法以及何时调用了拦截器方法。调用顺序如下所示:
- 输入拦截器的
@AroundConstruct
方法。InvocationContext:目标是null
,方法是null
,构造函数已设置。 - 调用 Beans 构造函数。
- 该调用通过 Interceptor 的
@AroundConstruct
方法存在。InvocationContext:Target 是 bean 实例,method 是null
,构造函数是 set。 - 拦截器的
@PostConstruct
方法被调用,调用proceed()并返回。InvocationContext:Target 是 bean 实例,method 是null
,构造函数是 set。 - 在上一次调用完全返回之后,调用 bean 的
@PostConstruct
方法。
我很惊讶地意识到,@PostConstruct
不是在 bean 的@PostConstruct
方法调用期间调用,而是在 bean 的构造和调用 bean 的@PostConstruct
方法之间调用。此外,bean@PostConstruct
方法的调用根本不会被拦截,不会被拦截器的@PostConstruct
方法或bi它的@AroundInvoke
方法拦截。
我/我的程序方面有什么错误吗?
有没有办法拦截bean的@PostConstruct
方法(方法也是如此@PreDestroy
)?
我需要准备上下文并用一些内容填充它们。此外,稍后调用堆栈深处的其他方法也可以知道调用是由容器通过这两种方法之一触发的。