Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SpringXML配置实现观察者模式?_Java_Spring_Configuration_Event Handling_Observer Pattern - Fatal编程技术网

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

Java 使用SpringXML配置实现观察者模式?,java,spring,configuration,event-handling,observer-pattern,Java,Spring,Configuration,Event Handling,Observer Pattern,假设beanA是事件发布者(可观察),beanB1、B2和B3是事件监听器(观察者) 所有的基站都实现了一些BEvenListener接口 如何在A中对可观察界面进行编码?我希望编写一些类似于普通Java的addEventListener(BEventListener listener)的代码 如何在Spring配置中设置所有Bs来监听A?通常的“setter”只允许一次注射,对吗?那么,如何在Spring中配置“加法器” Spring提供了ApplicationListener和Applica

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

所有的基站都实现了一些
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));
}

}

公共类观察者实现ApplicationListener{
私人可观察;
可观测公共空间(可观测值){
这。可观察=价值;
}
@凌驾
Application Event(事件)上的公共无效{
if(event.getSource()==可观察){
//过程事件
}
}
}
配置将是

<bean id="observable" class="tests.observer.Observable"/>

<bean id="observer" class="tests.observer.Observer">
    <property name="observable" ref="observable"/>
</bean>


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

这是我希望Spring能够添加到他们的XML配置中的内容,但目前为止,如果希望避免将代码绑定到Spring,您必须使用
方法调用FactoryBean

在本例中,假设您的
tests.observer.Observable
类中添加了以下方法

void addObserver(观察者)


这可能会有所帮助。
<bean id="observable" class="tests.observer.Observable"/>

<bean id="observer" class="tests.observer.Observer">
    <property name="observable" ref="observable"/>
</bean>
<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>