2017-09-24 2 views
1

Ich habe 2 Singletons in meiner JEE-Anwendung, die ich beim Start initialisieren möchte. Etwas wie folgt aus:Ausführungsreihenfolge von @PostConstruct

@Singleton 
@Startup 
public class ServiceB { 

    @EJB 
    private ServiceA a; 

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

ServiceB nicht wirklich ServiceA brauchen, habe ich nur noch die Abhängigkeit, um sicherzustellen, dass ServiceA vollständig initialisiert (sprich: @ PostConstruct-Methode beendet), bevor ServiceB der init() -Methode beginnt.

Aber es wartet nicht. ServiceB startet eigentlich vor ServiceA.

Gibt es eine Möglichkeit sicherzustellen, dass eine @ PostConstruct-Methode von Bean darauf wartet, dass eine andere Bean @ PostConstruct-Methode beendet wird?

Ich weiß, ich könnte nur die @PostConstruct Annotation in ServiceA entfernen und rufen Sie direkt aus ServiceB

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

aber ich habe Installationen, wo es keine ServiceB ist. Daher kann ich mich nicht auf ServiceB verlassen, um ServiceA zu initalisieren. ServiceA muss das selbst tun. Und ServiceB muss darauf warten, dass ServiceA damit erledigt wird.

Antwort

3

Verwenden Sie die Annotation @DependsOn, um eine Initialisierungsabhängigkeit von Start-Beans zu deklarieren.

Beispiel:

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