Multiple PostConstruct methods?

2020-07-02 09:19发布

It says in Java's documentation page for PostConstruct that

Only one method can be annotated with this annotation

But I just tried annotating three methods of a standalone application with PostConstruct. No compile errors, and all three of them are invoked and executed smoothly.

So what am I missing? In what kind of class can and cannot exist multiple PostConstruct annotations?

3条回答
乱世女痞
2楼-- · 2020-07-02 09:28

I tested with one class with 2 @PostConstruct, then I get the error WELD-000805: Cannot have more than one post construct method But it's ok if I have multiple @PostConstruct, each in one class. So I guess this sentence means: Only one method per class can be annotated with this annotation.

查看更多
劳资没心,怎么记你
3楼-- · 2020-07-02 09:30

This probably depends on the CDI implementation you are using. You did inject the object, where you have the annotations, didn't you?

I just tried it with WELD, which throws an exception as expected:

WELD-000805: Cannot have more than one post construct method annotated with @PostConstruct for [EnhancedAnnotatedTypeImpl] public  class Test
查看更多
做个烂人
4楼-- · 2020-07-02 09:34

Yes, it's seem Spring doesn't follow this restriction. I have found code to process this annotation which is InitDestroyAnnotationBeanPostProcessor, and the specific method:

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

So, spring support multi PostConstruct

查看更多
登录 后发表回答