2017-09-24 96 views
1

我在我的JEE应用程序中有2个单例,我想在启动时进行初始化。事情是这样的:@PostConstruct的执行顺序

@Singleton 
@Startup 
public class ServiceB { 

    @EJB 
    private ServiceA a; 

    @PostConstruct 
    private void init() { 
     .... 
    } 
} 

ServiceB并不真正需要ServiceA,我只是说相关性,以确保ServiceA完全初始化(读:@ PostConstruct法完成)ServiceB的init()之前 - 方法开始。

但它不等。 ServiceB实际上是在ServiceA之前启动的。

是否有任何方法可以确保一个Bean的@ PostConstruct-方法等待另一个Bean的@ PostConstruct方法完成?

我知道我可以只取出@PostConstruct注释中ServiceA,直接从ServiceB

@PostConstruct init() { 
     a.init(); 
    } 

调用它,但我有部署中没有ServiceB。所以我不能依靠ServiceB来启动ServiceA。 ServiceA必须自己做。 ServiceB必须等待ServiceA完成。

回答

3

使用@DependsOn注释来声明启动Bean的初始化依赖关系。

实施例:

@Singleton 
@Startup 
public class ServiceA { 
    @PostConstruct 
    public void init() { ... } 
} 

@Singleton 
@Startup 
@DependsOn("ServiceA") 
public class ServiceB { 
    @EJB 
    ServiceA a; 

    @PostConstruct 
    public void init() { ... } // will be called after a is initialized 
}