【问题标题】:Implement observer pattern with Spring XML config?使用 Spring XML 配置实现观察者模式?
【发布时间】:2012-10-29 01:00:37
【问题描述】:

假设 bean A 是事件发布者(可观察),而 bean B1B2B3 是事件侦听器(观察者)。

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

如何在A 中编写可观察接口?我希望编写类似 Java 的 addEventListener(BEventListener listener) 的代码。

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

Spring 提供了ApplicationListenerApplicationEventPublisherAware,它们允许编写监听事件的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>

这将允许显式设置发布者。

【问题讨论】:

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


【解决方案1】:

这是我希望 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>

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多