spring事件(一)--内置事件
来源:互联网 发布:淘宝网上 编辑:程序博客网 时间:2024/06/11 04:18
一、简介
spring框架是java开发中常用的,通常我们需要在spring的某些事件发生时,做某些操作。
在此介绍spring的内置事件,以父抽象类ApplicationContextEvent下的四个子事件类为主。
类图如下:
二、事件类
1、ApplicationContextEvent
是spring内置事件的父抽象类,构造方法传入spring的context容器,同时也有获取spring的context容器的方法。
源码如下:
/** * Base class for events raised for an {@code ApplicationContext}. * * @author Juergen Hoeller * @since 2.5 */@SuppressWarnings("serial")public abstract class ApplicationContextEvent extends ApplicationEvent { /** * Create a new ContextStartedEvent. * @param source the {@code ApplicationContext} that the event is raised for * (must not be {@code null}) */ public ApplicationContextEvent(ApplicationContext source) { super(source); } /** * Get the {@code ApplicationContext} that the event was raised for. */ public final ApplicationContext getApplicationContext() { return (ApplicationContext) getSource(); }}2、ContextRefreshedEvent
当spring容器初始化或刷新时,会触发此事件。此事件在开发中常用,用于在spring容器启动时,导入自定义的bean实例到spring容器中。
源码如下:
/** * Event raised when an {@code ApplicationContext} gets initialized or refreshed. * * @author Juergen Hoeller * @since 04.03.2003 * @see ContextClosedEvent */@SuppressWarnings("serial")public class ContextRefreshedEvent extends ApplicationContextEvent { /** * Create a new ContextRefreshedEvent. * @param source the {@code ApplicationContext} that has been initialized * or refreshed (must not be {@code null}) */ public ContextRefreshedEvent(ApplicationContext source) { super(source); }}
3、ContextStartedEvent
当spring启动时,或者说是context调用start()方法时,会触发此事件。
源码如下:
/** * Event raised when an {@code ApplicationContext} gets started. * * @author Mark Fisher * @author Juergen Hoeller * @since 2.5 * @see ContextStoppedEvent */@SuppressWarnings("serial")public class ContextStartedEvent extends ApplicationContextEvent { /** * Create a new ContextStartedEvent. * @param source the {@code ApplicationContext} that has been started * (must not be {@code null}) */ public ContextStartedEvent(ApplicationContext source) { super(source); }}4、ContextStoppedEvent
当spring停止时,或者说context调用stop()方法时,会触发此事件。
源码如下:
/** * Event raised when an {@code ApplicationContext} gets stopped. * * @author Mark Fisher * @author Juergen Hoeller * @since 2.5 * @see ContextStartedEvent */@SuppressWarnings("serial")public class ContextStoppedEvent extends ApplicationContextEvent { /** * Create a new ContextStoppedEvent. * @param source the {@code ApplicationContext} that has been stopped * (must not be {@code null}) */ public ContextStoppedEvent(ApplicationContext source) { super(source); }}5、ContextClosedEvent
当spring关闭时,或者说context调用close()方法时,会触发此事件。
源码如下:
/** * Event raised when an {@code ApplicationContext} gets closed. * * @author Juergen Hoeller * @since 12.08.2003 * @see ContextRefreshedEvent */@SuppressWarnings("serial")public class ContextClosedEvent extends ApplicationContextEvent { /** * Creates a new ContextClosedEvent. * @param source the {@code ApplicationContext} that has been closed * (must not be {@code null}) */ public ContextClosedEvent(ApplicationContext source) { super(source); }}三、监听类
在spring中,我们通常实现接口ApplicationListener<Event>来对事件进行监听,泛型传入事件的类型。
在接口内的方法onApplicationEvent中实现监听到事件时需处理的逻辑。
ApplicationListener接口的源码如下:
/** * Interface to be implemented by application event listeners. * Based on the standard {@code java.util.EventListener} interface * for the Observer design pattern. * * <p>As of Spring 3.0, an ApplicationListener can generically declare the event type * that it is interested in. When registered with a Spring ApplicationContext, events * will be filtered accordingly, with the listener getting invoked for matching event * objects only. * * @author Rod Johnson * @author Juergen Hoeller * @param <E> the specific ApplicationEvent subclass to listen to * @see org.springframework.context.event.ApplicationEventMulticaster */public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { /** * Handle an application event. * @param event the event to respond to */ void onApplicationEvent(E event);}四、代码实例
代码中,我们可以直接实现不带泛型的接口ApplicationListener,在代码中对不同事件做不同处理,如:
@Componentpublic class SpringContextEventDemo implements ApplicationListener { public void onApplicationEvent(ApplicationEvent event) { if(event instanceof ContextRefreshedEvent){ System.out.println("ContextRefreshedEvent happen"); }else if(event instanceof ContextStartedEvent){ System.out.println("ContextStartedEvent happen"); }else if(event instanceof ContextStoppedEvent){ System.out.println("ContextStoppedEvent happen"); }else if(event instanceof ContextClosedEvent){ System.out.println("ContextClosedEvent happen"); } }}
也可直接监听特定事件,即实现带泛型接口的ApplicationListener,在此以监听ContextRefreshedEvent事件为例。
1、监听类
@Componentpublic class SpringContextRefreshedEventDemo implements ApplicationListener<ContextRefreshedEvent> { public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { ApplicationContext ctx = contextRefreshedEvent.getApplicationContext(); System.out.println("ContextRefreshedEvent happen"); }}2、测试类
public class SpringSelfEventMain { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);// ctx.start(); //ContextStartedEvent事件发生// ctx.stop(); //ContextStoppedEvent事件发生// ctx.close(); //ContextClosedEvent事件发生 }}运行结果(在spring容器启动时,触发ContextRefreshedEvent事件,执行监听逻辑):
ContextRefreshedEvent happen
- spring事件(一)--内置事件
- Spring内置事件
- Spring内置事件
- spring内置ContextRefreshedEvent事件
- WPF事件(一)内置路由事件
- angular 事件监听,内置事件
- Socket.IO 内置事件
- 【Cocos】系统内置事件
- socket.io内置事件
- Socket.IO 内置事件
- angular内置事件
- socket内置事件
- socket内置事件
- Unity内置事件
- spring事件(三)--自定义事件
- Spring技术手册笔记(一):入门、Bean、消息、事件
- jQuery 事件(一)
- jQuery事件(一)
- 方法区
- AB1601 IO口反应延时的问题
- Maya Calendar
- [Oracle 11g r2(11.2.0.4.0)]案例分析2-HAIP 导致的数据库无法启动
- Selenium+Chrome(PhantomJs) Python爬虫
- spring事件(一)--内置事件
- java开发环境搭建
- 使用java、js和sql计算两个日期的时间差
- 我的 开发 知识点 集结 (更新中...)
- Zookeeper开源客户端ZKClient和Curator简介
- Zookeeper之Curator框架简单使用-yellowcong
- 阿里云CentOS7中安装RocketMQ4.10
- Html鼠标右键菜单代码
- Flex 学习之中之二十一 itemRenderer的用法