Springboot事件监听

先看一个demo,加入依赖

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
</parent>

<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
     </dependency>
</dependencies>

定义一个自定义事件,继承ApplicationEvent类

/**
 * 定义事件
 *
 */
public class MyApplicationEvent extends ApplicationEvent {

    private static final long serialVersionUID = 1L;

    public MyApplicationEvent(Object source) {
        super(source);
    }
}

定义一个事件监听器MyApplicationListener实现ApplicationListener接口,

package com.zhihao.miao;

import org.springframework.context.ApplicationListener;

public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {

    public void onApplicationEvent(MyApplicationEvent event) {
        System.out.println("接收到事件:"+event.getClass());
    }

}

主测试类:

package com.zhihao.miao;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        //配置事件监听器
        application.addListeners(new MyApplicationListener());
        ConfigurableApplicationContext context =application.run(args);
        //发布事件
        context.publishEvent(new MyApplicationEvent(new Object()));
        context.close();
    }
}

打印结果:


总结:
springboot事件监听的流程:

  1. 自定义事件,一般是继承ApplicationEvent抽象类。
  2. 定义事件监听器,一般是实现ApplicationListener接口。
  3. 配置监听器,启动的时候,需要把监听器加入到spring容器中。
  4. 发布事件。

其中第三步(将监听器纳入到spring容器)除了上面的方法之外,

application.addListeners(new MyApplicationListener());

还有三种方法

第二种方式
直接在MyApplicationListener类上加上@Component注解,纳入spring容器管理

package com.zhihao.miao;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationListener implements ApplicationListener<MyApplicationEvent> {

    public void onApplicationEvent(MyApplicationEvent event) {
        System.out.println("接收到事件:"+event.getClass());
    }

}

主类测试:

package com.zhihao.miao;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        ConfigurableApplicationContext context =application.run(args);
        //发布事件
        context.publishEvent(new MyApplicationEvent(new Object()));
        context.close();
    }
}

第三种方式
在配置文件中配置

context.listener.classes=com.zhihao.miao.MyApplicationListener

源码分析:
进入DelegatingApplicationListener类中的onApplicationEvent方法,getListeners是获取当前项目中的所有事件监听器。

源码分析

第四种方式
使用@EventListener注解

package com.zhihao.miao;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class MyEventHandle {


    /**
     * 参数任意(为Object)的时候所有事件都会监听到
     * 所有,该参数事件,或者其子事件(子类)都可以接收到
     */
    @EventListener
    public void event(Object event){
        System.out.println("MyEventHandle 接收到事件:" + event.getClass());
    }
    
}

主类测试:

package com.zhihao.miao;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        ConfigurableApplicationContext context =application.run(args);
        //发布事件
        context.publishEvent(new MyApplicationEvent(new Object()));
        context.close();
    }
}

打印结果:

源码分析:
进入@EventListener注解,文档说明中处理@EventListener是依靠EventListenerMethodProcessorbean,然后进入EventListenerMethodProcessorbean中,我们大概看一下流程,可以自己调试

图片.png

总结
配置事件监听器的四种方法

  1. SpringApplication.addListeners 添加监听器
  2. 把监听器纳入到spring容器中管理
  3. 使用context.listener.classes配置项配置(详细内容参照:DelegatingApplicationListener)
  4. 使用@EventListener注解,在方法上面加入@EventListener注解,且该类需要纳入到spring容器中管理(详细内容参照:EventListenerMethodProcessor,EventListenerFactory)

spring及springboot已经定义好的事件

spring的事件


springboot的事件


测试一下spring自带的事件:

@Component
public class MyEventHandle {

    /**
     * 监听spring的事件(运用停止事件,Application.stop()方法时候监听到。
     *
     */
    @EventListener
    public void eventStop(ContextStoppedEvent event){
        System.out.println("应用停止事件==========:"+event.getClass());
    }
}

主类测试:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        context.stop();
    }
}

测试:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,892评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,947评论 6 342
  • spring官方文档:http://docs.spring.io/spring/docs/current/spri...
    牛马风情阅读 1,721评论 0 3
  • 我的爱 我闻到 初春河边柳树间肆意摆动的嫩绿 像要招引鸟儿的栖息 我听到 盛夏金波碧浪的原野上曲调婉转的夜莺 像要...
    王团长1阅读 358评论 0 6
  • 说服客户:怎么说服客户采用你的产品,相信我我就讲, 不相信我就不讲了。 说话水准:说话要有水准,说替我公司...
    D051飞鹰阅读 173评论 0 2