Spring 监听器listener原理

Spring 监听器listener原理

Spring 监听器listener原理-基本使用(一)

Spring 监听器listener原理-手写监听器(二)

Spring 监听器listener原理-spring监听器源码分析(三)

介绍

Spring的监听器也可以说是一种观察者模式,它能实现事件与事件监听者直接的解耦,在Spring中监听器的实现主要有一下重要组件:

ApplicationListener:事件监听者,观察者;

ApplicationEvent:Spring 事件,记录事件源、事件内容、时间等数据;

有些场景事件主体主要是String或基本类型,4.2版本之后,不再强制要求继承ApplicationEvent,非ApplicationEvent子类的对象将被包装成PayloadApplicationEvent

@EventListener:除了实现ApplicationListener接口注册监听器,也可以使用注解的方式

ApplicationEventPublisher:发布事件;

自定义事件以及事件监听器

新增新事件只需要实现Spring提供的ApplicationEvent 的接口

package com.zhu.demo.event;

import org.springframework.context.ApplicationEvent;

public class InitializePost extends ApplicationEvent {

private String status ="Y";

public InitializePost(Object source) {

super(source);

}

public InitializePost(Object source, String status) {

super(source);

this.status = status;

}

public String getStatus() {

return status;

}

public void setStatus(String status) {

this.status = status;

}

}

同理新增监听器只需要实现ApplicationListener接口

@Component

public class MyListener1 implements ApplicationListener {

@Override

public void onApplicationEvent(InitializePost event) {

System.out.println("--------------: " + event.getStatus());

}

}

运行Spring发布事件

public class DemoApplication {

public static void main(String[] args) {

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

applicationContext.publishEvent(new InitializePost(applicationContext, "Y"));

}

}

22:11:36.945 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4a87761d

22:11:36.997 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'

22:11:37.065 [main] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [G:\study\Listenerdemo\target\classes\com\zhu\demo\listener\MyListener1.class]

22:11:37.098 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'

22:11:37.100 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'

22:11:37.101 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'

22:11:37.102 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'

22:11:37.112 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'

22:11:37.115 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myListener1'

--------------: Y

监听Spring发布的事件

Spring容器启动的时候在不同阶段会发布不同事件,我们可以根据自己的需求进行监听。(阿里的nacos服务自动注册原理就是监听到web容器初始化完成事件,完成自动注册发现)。

Spring容器启动完之后,会发布一个ContextRefreshedEvent事件,我们可以实现自己的监听器进行监听。

@Component

public class MyListener2 implements ApplicationListener {

@Override

public void onApplicationEvent(ContextRefreshedEvent event) {

System.out.println("-----------------:"+event.getSource().getClass());

}

}

运行结果

-----------------:class org.springframework.context.annotation.AnnotationConfigApplicationContext

使用@EventListener注册监听器

@ComponentScan({"com.zhu"})

@Configuration

public class AppConfig {

@EventListener

public void test(InitializePost initializePost){

System.out.println("--------------: "+initializePost.getStatus());

}

}

运行结果

--------------: Y

PayloadApplicationEvent

有些时候我们事件传递的对象是一些简单的对象,比如一个字符串,不想继承ApplicationEvent对象,可以使用PayloadApplicationEvent

@Component

public class PayloadApplicationListener implements ApplicationListener> {

@Override

public void onApplicationEvent(PayloadApplicationEvent event) {

System.out.println(event.getPayload());

}

}

public static void main(String[] args) {

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

//applicationContext.publishEvent(new InitializePost(applicationContext, "Y"));

applicationContext.publishEvent("hello world");

//applicationContext.publishEvent(new C());

}

运行结果

hello world

Spring监听器的基本使用到这里的结束了,后面会仿照Spring,手写一个监听器框架,带大家理解Spring的监听器的原理

相关推荐

明明骑着驴,大卫为什么要让拿破仑骑马?
beat365上不去

明明骑着驴,大卫为什么要让拿破仑骑马?

📅 07-12 👁️ 2401
安的解释
beat365上不去

安的解释

📅 08-06 👁️ 2435
探索成都共享单车,了解哪些共享单车好 • 本地金
墙纸用几年要换 用了几年的墙纸怎么换
365足球体育网站

墙纸用几年要换 用了几年的墙纸怎么换

📅 06-29 👁️ 6883
2021老人机最全价位推荐(60岁以上老人机选购指南)智能 ...
肉牛养殖技术有哪些
365足球体育网站

肉牛养殖技术有哪些

📅 09-19 👁️ 7618