2017-09-24 2 views
1

시작시 초기화하려는 내 JEE 응용 프로그램에 2 개의 싱글 톤이 있습니다. 이런 식으로 뭔가가 : 정말 ServiceA이 필요하지 않습니다@PostConstruct의 실행 순서

@Singleton 
@Startup 
public class ServiceB { 

    @EJB 
    private ServiceA a; 

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

ServiceB가, 난 그냥 (읽기 : PostConstruct의-방법이 완료 @) ServiceA가 완전히 초기화되어 있는지 확인하는 종속성을 추가 ServiceB의 init() 이전에 -Method가 시작됩니다.

하지만 기다리지 않습니다. 실제로 ServiceB는 ServiceA 전에 시작됩니다.

하나의 Bean의 @ PostConstruct- 메소드가 다른 Bean의 @ PostConstruct- 메소드가 완료 될 때까지 기다릴 수있는 방법이 있습니까?

는 난 그냥 ServiceA에 @PostConstruct 주석을 제거하고 ServiceB

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

에서 직접 호출 할 수 있습니다 알고 있지만 ServiceB이없는 경우 나 배포가 있습니다. 그래서 나는 ServiceA를 초기화하기 위해 ServiceB에 의존 할 수 없다. ServiceA는 그 자체를해야합니다. ServiceB는 ServiceA가 완료 될 때까지 기다려야합니다.

답변

3

@DependsOn 주석을 사용하여 시동 빈에 초기화 종속성을 선언하십시오.

예 :

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