8

Spring3.0.2を使用しています。私は2つの比較的単純なBeanの定義を持っています。1つには@PostConstruct(bean'A')があり、これは@DependsOn Bean(bean'B')の準備が必要な一連のイベントをトリガーします。ただし、Bean'A'はBean'B'に依存していると述べたにもかかわらず、Bean'B'が完全に初期化される前にBean'A'のイベント(ライフサイクルメソッド)が実行されているようです。

Beanが@DependsOnを介して「依存」している(または、さらに言えば、Bean定義では依存している)ということは、依存Beanのライフサイクルメソッドが、そのBeanに依存しているBeanの前に完了することを意味しますか?

Bean'B'のライフサイクルメソッドは、Bean' A'の前に完了しますか?

アップデート

Bean Aは、JMSテンプレートを使用して、初期化したことを通知するメッセージを送信するカスタムクラスです。

上記のメッセージの受信者はメッセージを処理し、その構成をMessageListeningContainer(Bean B)に転送します。

最初の部分は、BeanBがDefaultLifecycleProcessorによって開始される前にすべて発生しています。

@Component
@DependsOn("beanB")
public class BeanA {
    @PostConstruct
    public void init() {
        // do stuff
    }
}

<bean id="beanB" class="org.springframework.jms.listener.DefaultMessageListenerContainr">
    <!-- other configuration -->
</bean>

initメソッドに、Beanbのインジェクションと2つのロギングステートメントを追加しました。

container.isRunning();
container.isActive();

スプリングソースを調べたところ、Initializationメソッドの後でisActiveがtrueに設定されています(doInitializedが完了しました)。isRunningは、doStartが完了した後に設定されます。doStartは、@PostConstruct注釈付きメソッドが呼び出された後に発生するDefaultLifecycleProcessorによってトリガーされます。

Bean bが初期化されて開始された後、Postconstructメソッドが呼び出されることをどのように保証できますか?

4

1 に答える 1

1

特定のケース@PostConstructでは、Bが完全に初期化されるまで、BeanAのメソッドは呼び出されません。そのすべての依存関係が注入され、@PostConstruct実行が終了します。

更新:ここではSpring Lifecycle機能に依存しているのでLifecycle、Aに実装して、JMS呼び出しをstart()そこのメソッドに移動できますか?

于 2012-01-11T16:47:51.970 に答える