【Spring Framework】Spring入门教程(七)Spring 事件
内置事件
Spring中的事件是一个ApplicationEvent
类的子类,由实现ApplicationEventPublisherAware
接口的类发送,实现ApplicationListener
接口的类监听。
ApplicationContext 事件
Spring中已经定义了一组内置事件,这些事件由ApplicationContext
容器发出。
例如,ContextStartedEvent
在ApplicationContext
启动时发送,ContextStoppedEvent
在ApplicationContext
停止时发送。
实现ApplicationListener
的类可以监听事件。
Spring的事件是同步的(单线程的),会被阻塞。
监听ApplicationContext事件
要监听ApplicationContext
事件,监听类应该实现ApplicationListener
接口并重写onApplicationEvent()
方法。
ContextStartEventHandler.java
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;
public class ContextStartEventHandler implements ApplicationListener<ContextStartedEvent>{
@Override
public void onApplicationEvent(ContextStartedEvent event) {
System.out.println("ApplicationContext 启动... ");
}
}
Test.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// fire the start event.
// ((ConfigurableApplicationContext) context).start();
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// fire the start event.
context.start();
// ...
}
}
在XML配置文件中,将该类为声明为Bean,以便Spring容器加载该Bean,并向其传送事件。
<bean id="contextStartEventHandler" class="ContextStartEventHandler"></bean>
自定义事件
除了内置事件,Spring中也可以使用自定义事件。
怎样使用自定义事件:
- 创建事件类 – 扩展
ApplicationEvent
类,创建事件类。 - 创建发送类 – 发送类获取
ApplicationEventPublisher
实例发送事件。 - 创建监听类 – 实现
ApplicationListener
接口,创建监听类。
事件类
事件类用于存储事件数据。下面创建一个简单的事件类。
CustomEvent.java
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent {
public CustomEvent(Object source, String message) {
super(source);
}
public String toString() {
return "我是自定义事件";
}
}
发送类
发送类创建事件对象并发送。
要发送事件,这里介绍2种方法:
- 使用
@autowired
注解注入ApplicationEventPublisher
实例。
CustomEventPublisher.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
public class CustomEventPublisher {
@Autowired
private ApplicationEventPublisher publisher;
public void publish() {
CustomEvent event = new CustomEvent(this);
publisher.publishEvent(event);
}
}
- 发送类实现
ApplicationEventPublisherAware
接口,获取ApplicationEventPublisher
实例。
CustomEventPublisher.java
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
public class CustomEventPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
// 必须重写这个方法获取ApplicationEventPublisher
public void setApplicationEventPublisher (ApplicationEventPublisher publisher){
this.publisher = publisher;
}
public void publish() {
CustomEvent event = new CustomEvent(this);
publisher.publishEvent(event);
}
}
如果发送类实现了ApplicationEventPublisherAware
接口,发送类必须声明为bean,Spring容器将其标识为事件发送者。
<bean id="customEventPublisher" class="CustomEventPublisher"/>
监听类
监听类监听事件。监听类必须实现ApplicationListener
接口,并且被定义为Bean以便Spring容器可以加载它。
beans.xml
<bean id="customEventHandler" class="CustomEventHandler"/>
CustomEventHandler.java
import org.springframework.context.ApplicationListener;
public class CustomEventHandler implements ApplicationListener<CustomEvent> {
public void onApplicationEvent(CustomEvent event) {
System.out.println("收到事件:" + event.toString());
}
}
运行
测试自定义事件。
Test.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
CustomEventPublisher publisher = (CustomEventPublisher) context.getBean("customEventPublisher");
publisher.publish();
}
}
最新文章
- 用Canvas写桌球游戏!!!
- 关于arcengine中geoprocessor使用的困惑
- Swift中的部分更新与旧版的区别
- Unity3D研究院之Prefab里面的Prefab关联问题(转)
- secure erase 时必须umount
- poj2778
- Keil 4 与Proteus 7.8联调
- 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制
- Bootstrap_排版_列表
- input 输入验证
- ansible Strategies
- JAVA学习知识点汇总
- .Net Core 1.0升级2.0(xproj项目迁移到.csproj )
- java利用自定义类型对树形数据类型进行排序
- 【数据库】MySql分割字符串
- 浏览器与WEB服务器交互
- 【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
- Centos7编译安装GCC7.2
- ckplayer跨域调用
- Javascript 变量、函数的声明
热门文章
- Java连接redis之Jedis使用
- vue如何写组件(script标签引入的方式)
- Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)
- Python技法1:变长和定长序列拆分
- 【 [SCOI2016]幸运数字】
- 洛谷 P6383 -『MdOI R2』Resurrection(DP)
- Codeforces 840C - On the Bench(dp/容斥原理)
- Vue 中使用 extent 开发loading等全局 组件
- Python—python2.7.5升级到2.7.14或者直接升级到3.6.4
- (转载)Java里新建数组及ArrayList java不允许泛型数组