假设 bean A
是事件发布者(可观察的),bean B1
、B2
和 B3
是事件监听者(观察员)。
所有 B 都实现了一些 BEvenListener
接口(interface)。
如何在A
中编写可观察接口(interface)?我希望编写一些类似于普通 Java 的 addEventListener(BEventListener listener)
的代码。
如何在Spring配置中设置所有B监听A
?通常的“二传手”只允许注入(inject)一次,对吧?那么,如何在Spring中配置“加法器”呢?
Spring 提供了 ApplicationListener
和 ApplicationEventPublisherAware
允许编写监听事件的 bean,发布到上下文中。但是这种机制无需配置即可工作,即 XML 文件不会说明哪个 bean 监听哪个。只有类型很重要,所有编码为监听某个事件的 bean 都会监听它(如果出现在上下文中)。 IE。事件是上下文范围的。
是否可以在发布者和监听器之间建立定向事件“ channel ”,以 XML 配置?
更新
我唯一的想法是注入(inject) 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>
这将允许明确设置发布者。
最佳答案
这是我希望 Spring 可以添加到他们的 XML 配置中的东西,但就目前而言,如果您想避免将代码绑定(bind)到 Spring,则必须使用 MethodInvokingFactoryBean
。
为了本示例的目的,假设已将以下方法添加到您的 tests.observer.Observable
类
void addObserver(Observer 观察者);
<bean id="observable" class="tests.observer.Observable"/>
<bean id="observer" class="tests.observer.Observer">
<property name="observable" ref="observable"/>
</bean>
<bean id="addObserver" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="observable" />
<property name="targetMethod" value="addObserver"/>
<property name="arguments">
<list>
<ref bean="observer" />
</list>
</property>
</bean>
关于java - 使用 Spring XML 配置实现观察者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295692/