【Spring】事件传播 ApplicationListener

Spring 的事件传播机制 是基于观察者模式(Observer)实现的,它可以将 Spring Bean 的改变定义为事件 ApplicationEvent,通过 ApplicationListener 监听 ApplicationEvent 事件,一旦Spring Bean 使用 ApplicationContext.publishEvent( ApplicationEvent event )发布事件后,Spring 容器会通知注册在 bean.xml 中所有 ApplicationListener 接口的实现类,最后 ApplicationListener 接口实现类判断是否响应刚发布出来的 ApplicationEvent 事件。

所以,要使用 Spring 事件传播机制需要以下四点:

1. 建立事件类,继承 ApplicationEvent 父类

2. 建立监听类,实现 ApplicationListener 接口

3. 在配置文件 bean.xml 中注册写好的所有 事件类 和 监听类

4. 需要发布事件的类 要实现 ApplicationContextAware 接口,并获取 ApplicationContext 参数

随后便可以开始使用 Spring 事件传播机制为我们服务:(为了讲解流程的连贯性,续以上步骤来测试)

4.1 在自己编写的需要发布事件的 Action 类中实例化 1 中编写好的事件类,并使用 ApplicationContext.publishEvent 发布事件

5. 通过 Spring 调用 Action 方法,观察输出结果(本文使用 Junit 测试)


以下为1-5步骤的源码:

1. 建立事件类 ActionEvent.java 

public class ActionEvent extends ApplicationEvent{

	public ActionEvent(Object source) {
		super(source);
		System.out.println("This is ActionEvent");
	}
}

2. 建立监听类 ActionListener1.java、ActionListener2.java

public class ActionListener1 implements ApplicationListener {

	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof ActionEvent){
			System.out.println("ActionListener1: "+event.toString());
		}
	}

}
public class ActionListener2 implements ApplicationListener {

	public void onApplicationEvent(ApplicationEvent event) {
		if(event instanceof ActionEvent){
			System.out.println("ActionListener2: "+event.toString());
		}
	}

}


3. 在 bean.xml 中注册事件类和监听类

	<bean id="loginaction" class="com.ayali.action.LoginAction"/>
	<bean id="listener1" class="com.ayali.action.ActionListener1"/>
	<bean id="listener2" class="com.ayali.action.ActionListener2"/>

4. 编写 需要发布事件的 loginAction.java

public class LoginAction implements ApplicationContextAware{

	private ApplicationContext applicationContext;
	
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}
	
	public void login(String username, String password){
		ActionEvent event = new ActionEvent(username);
		this.applicationContext.publishEvent(event);
	}

}

5. 编写测试方法

	public void testActionListener(){
		ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
		LoginAction loginAction = (LoginAction) ctx.getBean("loginaction");
		loginAction.login("jack", "123");
	}


输出结果为:

This is ActionEvent
ActionListener1:com.ayali.action.ActionEvent[source=jack]
ActionListener2:com.ayali.action.ActionEvent[source=jack]



End .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值