用Spring XML配置实现观察者模式?

时间:2012-11-08 18:47:50

标签: java spring configuration event-handling observer-pattern

假设bean A是事件发布者(observable),bean B1B2B3是事件监听器(观察者)。

所有B都实现了一些BEvenListener接口。

如何在A中对可观察的界面进行编码?我希望编写类似于通常的Java addEventListener(BEventListener listener)的代码。

如何设置所有B在Spring配置中监听A?通常的“setter”只允许一次注射,对吧?那么,如何在Spring中配置“adder”?

Spring提供ApplicationListenerApplicationEventPublisherAware,允许编写监听事件的bean,发布到上下文中。但是这种机制在没有配置的情况下工作,即XML文件没有说哪个bean监听哪个。只有类型很重要,所有编码为监听某些事件的bean都会在上下文中显示它。即事件是整个上下文。

是否可以在发布者和侦听器之间使用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>

这将允许明确设置发布者。

1 个答案:

答案 0 :(得分:0)

这是我希望Spring添加到他们的XML配置中的东西,但是如果你想避免将你的代码绑定到Spring,你必须使用MethodInvokingFactoryBean

出于本示例的目的,假设您的tests.observer.Observable

添加了以下方法

void addObserver(Observer 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>