java - @PostConstruct 的执行顺序

标签 java dependency-injection java-ee-6

我的 JEE 应用程序中有 2 个单例,我想在启动时对其进行初始化。像这样:

@Singleton
@Startup
public class ServiceB {

    @EJB
    private ServiceA a;

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

ServiceB 并不真正需要 ServiceA,我只是添加了依赖项以确保 ServiceA 在 ServiceB 的 init() - 方法开始之前完全初始化(阅读:@PostConstruct-method finished)。

但它不会等待。 ServiceB 实际上在ServiceA 之前启动。

有没有办法确保一个 Bean 的 @PostConstruct- 方法等待另一个 Bean 的 @PostConstruct- 方法完成?

我知道我可以删除 ServiceA 中的 @PostConstruct 注解并直接从 ServiceB 调用它

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

但我有没有 ServiceB 的部署。所以我不能依赖 ServiceB 来初始化 ServiceA。 ServiceA 必须自己做。 ServiceB 必须等待 ServiceA 完成它。

最佳答案

使用 @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
}

关于java - @PostConstruct 的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46393645/

相关文章:

java - 奇怪的 EJB 行为还是我错过了什么???

java 如何创建任意类的对象

java - Groovy 中的闭包 - 用等效的 Java 实现

Java扫描器+排序

Spring Javaconfig bean间依赖关系

inheritance - Java EE 6 注解继承之谜

java - java文字数组声明和new方法之间的区别

testing - 如何在测试中模拟外部依赖项?

c# - 关于如何将 Dapper 与 Structuremap 和依赖注入(inject)一起使用的简单但很好的示例

java - 下载servlet的doGet()抛出NullPointerException