【发布时间】:2012-10-29 01:00:37
【问题描述】:
假设 bean A 是事件发布者(可观察),而 bean B1、B2 和 B3 是事件侦听器(观察者)。
所有 B 都实现了一些 BEvenListener 接口。
如何在A 中编写可观察接口?我希望编写类似 Java 的 addEventListener(BEventListener listener) 的代码。
如何在 Spring config 中设置所有 B 监听 A?通常的“二传手”只允许一次注射,对吧?那么,如何在 Spring 中配置“adder”呢?
Spring 提供了ApplicationListener 和ApplicationEventPublisherAware,它们允许编写监听事件的bean,发布到上下文中。但是这种机制无需配置即可工作,即 XML 文件没有说明哪个 bean 听哪个。只有类型很重要,如果在上下文中存在,所有编码为侦听某个事件的 bean 都会侦听它。 IE。事件是上下文范围的。
是否可以在发布者和侦听器之间建立定向事件“通道”,以 XML 配置?
更新
我唯一的想法是注入 observable 来过滤事件。
所以,课程将是
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>
这将允许显式设置发布者。
【问题讨论】:
-
这可能会有所帮助。 springindepth.com/book/…
标签: java spring configuration event-handling observer-pattern