2

beanがイベント パブリッシャー (監視可能)でありA、 beansがイベント リスナー (オブザーバー) であるとします。B1B2B3

すべての B は何らかのBEvenListenerインターフェースを実装しています。

で監視可能なインターフェイスをコーディングする方法はA? 通常の Java のようなコードを書きたいと思っていますaddEventListener(BEventListener listener)

ASpring configでリッスンするすべてのBを設定するには? 通常の「セッター」では1回の注入しかできませんよね?では、Spring で「adder」を構成するにはどうすればよいでしょうか。

Spring は、コンテキストに発行されたイベントをリッスンする Bean を作成できるApplicationListenerとを提供します。ApplicationEventPublisherAwareただし、このメカニズムは構成なしで機能します。つまり、XML ファイルには、どの Bean がどれをリッスンするかが示されていません。タイプのみが重要であり、何らかのイベントをリッスンするようにコーディングされたすべての Bean は、コンテキストに存在する場合にそれをリッスンします。つまり、イベントはコンテキスト全体です。

パブリッシャーとリスナーの間のイベント「チャネル」を XML で構成することは可能ですか?

アップデート

私がまだ得た唯一のアイデアは、オブザーバブルを注入してイベントをフィルタリングすることです。

したがって、クラスは

public class Observable implements ApplicationEventPublisherAware {

public static class Event extends ApplicationEvent {

    public Event(Object source) {
        super(source);
    }

}

private ApplicationEventPublisher applicationEventPublisher;

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher value) {
    this.applicationEventPublisher = value;
}

public void somecode() {
    applicationEventPublisher.publishEvent(new Event(this));
}

}

public class Observer implements ApplicationListener<Observable.Event> {

private Observable observable;

public void setObservable(Observable value) {
    this.observable = value;
}

@Override
public void onApplicationEvent(Event event) {
    if( event.getSource() == observable ) {
        // process event
    }
}

}

構成は次のようになります

<bean id="observable" class="tests.observer.Observable"/>

<bean id="observer" class="tests.observer.Observer">
    <property name="observable" ref="observable"/>
</bean>

これにより、発行者を明示的に設定できます。

4

1 に答える 1