Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法

什么是ApplicationContext? 
它是spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些。 
ApplicationContext则是应用的容器。

Spring把Bean(object)放在容器中,需要用就通过get方法取出来。

ApplicationEvent

是个抽象类,里面只有一个构造函数和一个长整型的timestamp。

ApplicationListener

是一个接口,里面只有一个onApplicationEvent方法。

所以自己的类在实现该接口的时候,要实装该方法。

 

如果在上下文中部署一个实现了ApplicationListener接口的bean,

那么每当在一个ApplicationEvent发布到 ApplicationContext时,
这个bean得到通知。其实这就是标准的Oberver设计模式。

下面给出例子:

首先创建一个ApplicationEvent实现类:

  1. package com.spring.event;
  2. import org.springframework.context.ApplicationEvent;
  3. /**
  4. * <p>Class:EmailListEvent</p>
  5. * <p>Description:</p>
  6. * @author Liam
  7. * @Date [2012-9-7 上午8:42:07]
  8. */
  9. public class EmailEvent extends ApplicationEvent {
  10. /**
  11. * <p>Description:</p>
  12. */
  13. private static final long serialVersionUID = 1L;
  14. public String address;
  15. public String text;
  16. public EmailEvent(Object source) {
  17. super(source);
  18. }
  19. public EmailEvent(Object source, String address, String text) {
  20. super(source);
  21. this.address = address;
  22. this.text = text;
  23. }
  24. public void print(){
  25. System.out.println("hello spring event!");
  26. }
  27. }

给出监听器:

  1. package com.spring.event;
  2. import org.springframework.context.ApplicationEvent;
  3. import org.springframework.context.ApplicationListener;
  4. /**
  5. * <p>Class:EmailListener</p>
  6. * <p>Description:</p>
  7. * @author Liam
  8. * @Date [2012-9-7 上午8:44:53]
  9. */
  10. public class EmailListener implements ApplicationListener {
  11. public void onApplicationEvent(ApplicationEvent  event) {
  12. if(event instanceof EmailEvent){
  13. EmailEvent emailEvent = (EmailEvent)event;
  14. emailEvent.print();
  15. System.out.println("the source is:"+emailEvent.getSource());
  16. System.out.println("the address is:"+emailEvent.address);
  17. System.out.println("the email‘s context is:"+emailEvent.text);
  18. }
  19. }
  20. }

applicationContext.xml文件配置:

<bean id="emailListener" class="com.spring.event.EmailListener"></bean>

测试类:

  1. package com.spring.event;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. /**
  5. * <p>Class:Test</p>
  6. * <p>Description:</p>
  7. * @author Liam
  8. * @Date [2012-9-6 上午10:41:34]
  9. */
  10. public class Test {
  11. public static void main(String[] args) {
  12. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  13. //HelloBean hello = (HelloBean) context.getBean("helloBean");
  14. //hello.setApplicationContext(context);
  15. EmailEvent event = new EmailEvent("hello","[email protected]","this is a email text!");
  16. context.publishEvent(event);
  17. //System.out.println();
  18. }
  19. }
  1. 测试结果:
    1. <pre class="html" name="code">hello spring event!
    2. the source is:hello
    3. the address is:[email protected]
    4. the email‘s context is:this is a email text!
    5. </pre>
    6. <pre></pre>
时间: 2024-08-10 14:15:33

Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法的相关文章

SpringBoot基于注解切面监听事件

创建监听器三步骤: 1.事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标. 2.监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串. 3.事件发布者(publisher)事件发生的触发者. 代码展示: pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspe

Redis集群环境下的键值空间监听事件实现方案

一直想记录工作中遇到的问题和解决的方法,奈何没有找到一方乐土,最近经常反思,是否需要记录平时的点滴,后台还是决定下定决心记录一些,以便以后用到的时候找不着,实现这样的一个功能主要也是业务所需要的. 需求:要求统计所有会员在线人数,并根据会员在线状态同步改变人数. 之前用户登录使用session去控制,那么可以通过session进行在线用户人数统计,后来实现无状态不在依赖session作为用户在线的标准,使用Redis替换了Session,那么用户直接退出也好做,但是会存在用户直接关闭页面的情况,

JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>句柄添加监听事件</title> <script type="text/javascript" src="tzy.js"></script> </head> <body>

浅谈postMessage多页面监听事件

最近做了一个Echarts和Highcharts多图多页面连动的效果,就用到postMessage 如下介绍: 最开始在最外围的页面也就是所有页面的父级页面添加postMessage监听事件以便监听下面子级页面的动态,代码: window.parent.addEventListener('message',function(e){ if(e.source != window.parent) return; var names = localStorage.getItem("toName"

ios ---键盘的监听事件

//在view将要出现的时候重载viewWillAppear方法添加通知 监听事件 keyboardWillShow:  keyboardWillHide: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:

js html 交互监听事件学习

事件处理程序(handler): HTML事件处理程序: <input type="button" value="Click Here" onclick="showMessage();" /> <script type="text/javascript"> function showMessage() { alert('Clicked!'); } JavaScript指定事件处理程序: <inpu

Android中Button的五种监听事件

简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activity本身作为事件监听器,实现onClickListener5.外部类作为监听器 ButtonListenerActivity.class public class ButtonListenerActivity extends AppCompatActivity implements View.On

Android——监听事件总结1

各种监听事件 1.按钮 Button(1)点击监听 btn_1.setOnClickListener(new View.OnClickListener() { (2)长按监听 btn_1.setOnLongClickListener(new View.OnLongClickListener() { 2.单选框 RadioGroup radio_gp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 3.复选

datePicker 及 timePicker 监听事件 获取用户选择 年月日分秒信息

public class MainActivity extends AppCompatActivity { private TimePicker timePicker; private DatePicker datePicker; private Calendar cal; private int year; private int month; private int day; private int hour; private int minute; @Override protected