java 多个PostConstruct方法?

0s0u357o  于 2023-05-21  发布在  Java
关注(0)|答案(6)|浏览(278)

在PostConstruct的Java's documentation页面中指出
只有一个方法可以用此注解进行注解
但我只是尝试用PostConstruct注解一个独立应用程序的三个方法。没有编译错误,并且所有三个都被顺利地调用和执行。
我错过了什么?在什么样的类中可以和不可以存在多个PostConstruct注解?

2uluyalo

2uluyalo1#

是的,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

sqyvllje

sqyvllje2#

这可能取决于您使用的CDI实现。你确实注入了对象,在你有注解的地方,不是吗?
我刚刚用WELD尝试了一下,它像预期的那样抛出了一个异常:

WELD-000805: Cannot have more than one post construct method annotated with @PostConstruct for [EnhancedAnnotatedTypeImpl] public  class Test
gg58donl

gg58donl3#

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");
}

然后,执行将按下图所示顺序进行:

tp5buhyn

tp5buhyn4#

在一个类中,它允许有多个@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.
dnph8jn4

dnph8jn45#

我用2@PostConstruct测试了一个类,然后我得到了错误WELD-000805:不能有一个以上的post construct方法,但如果我有多个@PostConstruct,每个都在一个类中,这是可以的。所以我猜这句话的意思是:每个类只能有一个方法可以使用此注解进行注解。

lymgl2op

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。

相关问题