在PostConstruct的Java's documentation页面中指出
只有一个方法可以用此注解进行注解
但我只是尝试用PostConstruct注解一个独立应用程序的三个方法。没有编译错误,并且所有三个都被顺利地调用和执行。
我错过了什么?在什么样的类中可以和不可以存在多个PostConstruct注解?
在PostConstruct的Java's documentation页面中指出
只有一个方法可以用此注解进行注解
但我只是尝试用PostConstruct注解一个独立应用程序的三个方法。没有编译错误,并且所有三个都被顺利地调用和执行。
我错过了什么?在什么样的类中可以和不可以存在多个PostConstruct注解?
6条答案
按热度按时间2uluyalo1#
是的,Spring似乎不遵循这个限制。我已经找到了处理这个注解的代码,它是
InitDestroyAnnotationBeanPostProcessor
,具体方法是:所以,spring支持多PostConstruct
sqyvllje2#
这可能取决于您使用的CDI实现。你确实注入了对象,在你有注解的地方,不是吗?
我刚刚用WELD尝试了一下,它像预期的那样抛出了一个异常:
gg58donl3#
Spring支持多PostConstruct,在运行时应用程序会选择先运行,在类中排序在最前面的那个。参见以下示例:
然后,执行将按下图所示顺序进行:
tp5buhyn4#
在一个类中,它允许有多个
@PostConstruct
注解的方法,并且执行顺序是随机的。输出
dnph8jn45#
我用2@PostConstruct测试了一个类,然后我得到了错误WELD-000805:不能有一个以上的post construct方法,但如果我有多个@PostConstruct,每个都在一个类中,这是可以的。所以我猜这句话的意思是:每个类只能有一个方法可以使用此注解进行注解。
lymgl2op6#
截至2023年,Jakarta EE文档仍然说:
给定类中只有一个方法可以使用此注解进行注解。
8 - https://jakarta.ee/specifications/platform/8/apidocs/javax/annotation/postconstruct
10 - https://jakarta.ee/specifications/platform/10/apidocs/jakarta/annotation/postconstruct
它仍然可以在Spring中工作,尽管我找不到除了https://docs.spring.io/spring-framework/reference/core/beans/annotation-config/postconstruct-and-predestroy-annotations.html之外的
@PostConstruct
的Spring文档,这些文档不允许指定1或N注解。我猜这是其中的一个例子,当替代CDI实现说,完全兼容Spring和标准,但你可能会期待错误的过程中,如果你试图远离Spring。