它在PostConstruct的Java's documentation页面中说明了
此注释只能注释一种方法
但我只是尝试使用PostConstruct注释独立应用程序的三种方法。没有编译错误,并且所有三个都被调用并顺利执行。
那我错过了什么?什么样的类可以存在多个PostConstruct注释?
答案 0 :(得分:13)
是的,看起来Spring并没有遵循这个限制。我找到了处理此注释的代码InitDestroyAnnotationBeanPostProcessor
,以及具体的方法:
public void invokeInitMethods(Object target, String beanName) throws Throwable {
Collection<LifecycleElement> initMethodsToIterate =
(this.checkedInitMethods != null ? this.checkedInitMethods : this.initMethods);
if (!initMethodsToIterate.isEmpty()) {
boolean debug = logger.isDebugEnabled();
for (LifecycleElement element : initMethodsToIterate) {
if (debug) {
logger.debug("Invoking init method on bean '" + beanName + "': " + element.getMethod());
}
element.invoke(target);
}
}
}
所以,spring支持多PostConstruct
答案 1 :(得分:5)
这可能取决于您使用的CDI实施。你确实注入了对象,你有注释,不是吗?
我刚刚尝试使用WELD,它会按预期抛出异常:
WELD-000805: Cannot have more than one post construct method annotated with @PostConstruct for [EnhancedAnnotatedTypeImpl] public class Test
答案 2 :(得分:1)
Spring支持多个PostConstruct ,在运行时应用程序将选择首先运行,该运行在类的顶部。参见下面的示例:
@PostConstruct
private void firstPostConstructor() {
LOGGER.info("First Post Constructor");
}
@PostConstruct
private void secondPostConstructor() {
LOGGER.info("Second Post Constructor");
}
@PostConstruct
public void thirdPostConstructor() {
LOGGER.info("Third Post Constructor");
}
然后将相应地按如下所示命令执行:
答案 3 :(得分:0)
我用2个@PostConstruct对一个类进行了测试,然后得到了错误 WELD-000805:不能有多个后构造方法 但是如果我在一个类中有多个@PostConstruct,也可以。 所以我想这句话的意思是: 每个类只能使用该注释来注释一个方法。
答案 4 :(得分:0)
在一个类中,它允许有多个 @PostConstruct
注释方法,并且执行顺序是随机的。
@PostConstruct
public void myInit() {
System.out.println("inside the post construct method1. ");
}
@PostConstruct
public void myInit2() {
System.out.println("inside the post construct method2. ");
}
@PostConstruct
public void myInit3() {
System.out.println("inside the post construct method3. ");
}
@PostConstruct
public void myInit4() {
System.out.println("inside the post construct method4. ");
}
输出
FINE: Creating shared instance of singleton bean 'employee'
inside the default constructor....
inside the post construct method4.
inside the post construct method.
inside the post construct method2.
inside the post construct method3.