2017-09-24 48 views
1

私は起動時に初期化したい私のJEEアプリケーションに2つのシングルトンを持っています。このような何かを:本当にSERVICEAを必要としません@PostConstructの実行順序

@Singleton 
@Startup 
public class ServiceB { 

    @EJB 
    private ServiceA a; 

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

ServiceBが、私は(読み:PostConstructメソッドが終了@)サービスAが完全に初期化されていることを確認するために、依存関係を追加ServiceBのinit()の前方法 - が開始されます。

しかし、それは待っていません。 ServiceBはServiceAの前に実際に起動します。

1つのBeanの@ PostConstruct-メソッドが別のBeanの@ PostConstruct-メソッドが完了するのを待つ方法はありますか?

私はちょうどSERVICEAで@PostConstruct注釈を削除し、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 
}