Spring5源码 - 10 Spring事件监听机制_应用篇

简介: Spring5源码 - 10 Spring事件监听机制_应用篇

20200914143739548.png

Spring事件概览

Spring事件体系包括三个组件:事件,事件监听器,事件广播器

事件



20201029141311134.png


Spring的内置事件中由系统内部进行发布,只需注入监听器


ContextRefreshedEvent


当容器被实例化或refreshed时发布.如调用refresh()方法, 此处的实例化是指所有的bean都已被加载,后置处理器都被激活,所有单例bean都已被实例化, 所有的容器对象都已准备好可使用. 如果容器支持热重载,则refresh可以被触发多次(XmlWebApplicatonContext支持热刷新,而 GenericApplicationContext则不支持)


ContextStartedEvent


当容器启动时发布,即调用start()方法, 已启用意味着所有的Lifecycle bean都已显式接收到了start 信号


ContextStoppedEvent


当容器停止时发布,即调用stop()方法, 即所有的Lifecycle bean都已显式接收到了stop信号 , 关闭的容器可以通过start()方法重启


ContextClosedEvent


当容器关闭时发布,即调用close方法, 关闭意味着所有的单例bean都已被销毁.关闭的容器不能被重启或refresh


image.gif


23岁的程序猿大爷都说了,让整个小demo , 那来吧

20201029214339647.png

先贴个配置类

package com.artisan.eventlistener2;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.artisan.eventlistener2")
public class ArtisanConfig {
}


自定义事件

事件类需要继承ApplicationEvent

package com.artisan.eventlistener2;
import org.springframework.context.ApplicationEvent;
public class ArtisanEvent  extends ApplicationEvent {
  private String msg ;
  public ArtisanEvent(Object source) {
    super(source);
  }
  public ArtisanEvent(Object source,String msg) {
    super(source);
    this.msg = msg ;
  }
  public void print(){
    System.out.println(msg);
  }
}


作为测试,使用一个简单的pojo

  1. 自定义事件需要继承ApplicationEvent
  2. 因为ApplicationEvent extends EventObject ,所以子类的构造方法需要调用super()


事件监听器

下面演示两种方式

基于接口

package com.artisan.eventlistener2;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class ArtisanListener implements ApplicationListener<ArtisanEvent> {
  @Override
  public void onApplicationEvent(ArtisanEvent event) {
    System.out.println("实现ApplicationListener  监听到ArtisanEvent.....");
    event.print();
  }
}


事件监听器需要实现ApplicationListener接口,泛型接口,泛型类类型就是事件类型

其次需要是spring容器托管的bean,所以这里加了@component,重写onApplicationEvent方法


基于注解


package com.artisan.eventlistener2;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class ArtisanListenerByAnno   {
  @EventListener(ArtisanEvent.class)
  public void onApplicationEvent(ArtisanEvent event) {
    System.out.println("EventListener  监听到ArtisanEvent.....");
    event.print();
  }
}


方法上需要标注 @EventListener(ArtisanEvent.class),方法名任意

其次需要是spring容器托管的bean,所以这里加了@component


@EventListener,修饰在方法上,是不是比基于实现类的方式要好,不用一个事件一个类了,确实如此。


事件广播器

package com.artisan.eventlistener2;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ArtisanTest {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ArtisanConfig.class);
    ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));
  }
}


核心就是ac.publishEvent

ac.publishEvent(new ArtisanEvent("xxxx","msg from artisanEvent"));


【测试结果】


20201029214852487.png


是不是发现,这不就是【观察者模式】吗? ----------确实确实,这就是观察者模式的典型应用,那spring是怎么实现的呢?

下篇我们继续分析Spring的源码实现

相关文章
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
130 2
|
13天前
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
63 31
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
146 14
|
2月前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
74 2
|
2月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
140 4
|
3月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
103 8
|
6月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
8月前
|
Java 应用服务中间件 Maven
ContextLoaderListener在Spring应用中的作用与配置方法
ContextLoaderListener在Spring应用中的作用与配置方法
|
Java 开发者 微服务
深入解析@SpringBootApplication注解:简化Spring Boot应用的配置
在现代的Java开发中,Spring Boot框架成为了构建微服务和快速开发应用的首选。Spring Boot的成功部分归功于其简化的配置和约定大于配置的理念。而`@SpringBootApplication`注解则是Spring Boot应用的入口,负责自动配置和启动Spring Boot应用。本文将深入探讨`@SpringBootApplication`注解的作用、用法,以及在Spring Boot应用中的应用场景。
1289 1