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

标签 java spring configuration event-handling observer-pattern

假设 bean A 是事件发布者(可观察的),bean B1B2B3 是事件监听者(观察员)。

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

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

如何在Spring配置中设置所有B监听A?通常的“二传手”只允许注入(inject)一次,对吧?那么,如何在Spring中配置“加法器”呢?

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

相关文章:

java - 在 Java 中过滤列表,同时避免 o(n) 复杂度中的 ConcurrentModificationException

java - 如何在 JavaFX 应用程序中显示 HTML

java - "must implement the inherited abstract method"

java - 如何正确地将 2 列映射到同一实体

spring - 在没有域模型的情况下将 Spring Security 插件与 Grails 一起使用

Apache 代理导致 ERR_CONTENT_DECODING_FAILED 错误

java - _XReply() 使用 _XIOError() 终止应用程序

xml - 关于 Beans 的 Spring p 命名空间的共识是什么?

c++ - Eclipse Mars - 为 C++ 项目设置默认设置(默认设置为 C++11)

java - 向 JFrame 添加多个按钮,文本+颜色未显示