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

  1. Spring 监听器listener原理-基本使用(一)
  2. Spring 监听器listener原理-手写监听器(二)
  3. Spring 监听器listener原理-spring监听器源码分析(三)

介绍

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

  • ApplicationListener:事件监听者,观察者;
  • ApplicationEvent:Spring 事件,记录事件源、事件内容、时间等数据;
  • @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<InitializePost> {
    @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"));
    }

}
--------------: Y

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

@Component
public class MyListener2 implements ApplicationListener<ContextRefreshedEvent> {


    @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<PayloadApplicationEvent<String>> {

    @Override
    public void onApplicationEvent(PayloadApplicationEvent<String> 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的监听器的原理

你可能感兴趣的:(Spring源码,spring,java)