java使用SpringXML配置实现观察者模式?
假设bean A
是事件发布者(可观察),bean B1
、B2
和B3
是事件监听器(观察者)
所有的B都实现了一些BEvenListener
接口
如何在A
中编写可观察的接口?我希望编写一些类似于普通Java的addEventListener(BEventListener listener)
的代码
如何在Spring配置中设置所有Bs来监听A
?通常的“setter”只允许一次注射,对吗?那么,如何在Spring中配置“加法器”
Spring提供了ApplicationListener
和ApplicationEventPublisherAware
,允许编写bean来监听事件,并发布到上下文中。但是这种机制在没有配置的情况下工作,也就是说,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>
这将允许显式设置发布服务器
# 1 楼答案
这是我希望Spring能够添加到他们的XML配置中的东西,但目前来看,如果希望避免将代码绑定到Spring,就必须使用
MethodInvokingFactoryBean
在本例中,假设以下方法已添加到
tests.observer.Observable
类中void addObserver(Observer observer);