有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用SpringXML配置实现观察者模式?

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

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

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

如何在Spring配置中设置所有Bs来监听A?通常的“setter”只允许一次注射,对吗?那么,如何在Spring中配置“加法器”

Spring提供了ApplicationListenerApplicationEventPublisherAware,允许编写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) 个答案

  1. # 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>