beanがイベント パブリッシャー (監視可能)でありA
、 beansがイベント リスナー (オブザーバー) であるとします。B1
B2
B3
すべての B は何らかのBEvenListener
インターフェースを実装しています。
で監視可能なインターフェイスをコーディングする方法はA
? 通常の Java のようなコードを書きたいと思っていますaddEventListener(BEventListener listener)
。
A
Spring 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>
これにより、発行者を明示的に設定できます。