Spring监听器---ApplicationListener

说到事件监听,想到的确定是观察者模式。可是这儿主要说下spring中的监听是怎么样的流程。spring

这就不得不说到spring容器的refresh方法,容器启动过程当中,listener相关的主要是这个三个方法:initApplicationEventMulticaster方法初始化事件多播器,后续的事件发布都是由多播器来发布的;registerListeners注册监听器到前面初始化好的多播器上面去;并发

finishRefresh容器启动完成最后刷新,发布ContextRefreshedEvent事件。

 

 

1.初始化多播器:获取bean工厂对象ConfigurableListableBeanFactory,判断容器中是否有applicationEventMulticaster多播器,若是没有则建立一个一个简单事件多播器SimpleApplicationEventMulticaster并注册到容器中,后续使用app

 

 

 

2.注册监听器到多播器上并发布早期事件:首先获取容器中已有的监听器(成品对象),注册到多播器;而后获取bean定义中的监听器,也就是咱们本身定义的监听器;一样也注册到多播器上去;最后若是有早期事件就去发布早期事件,multicastEvent方法ide

 

 

发布事件:multicastEvent方法----->invokeListener方法---->doInvokeListener方法调用监听器的onApplicationEvent测试

 

3.执行finishRefresh方法发布ContextRefreshedEvent事件,标志的容器已经启动完成。spa

 

 

监听器的流程完了,咱们如今来看下使用code

首先实现一个本身的监听器对象

package com.nijunyang.spring.listener;

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

/**
 * Description:
 * Created by nijunyang on 2020/2/20 21:53
 */
@Component
public class MyListener implements ApplicationListener<ApplicationEvent> {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("收到事件:" + event.toString());
    }
}

 

新建一个本身的事件:blog

package com.nijunyang.spring.listener;

import org.springframework.context.ApplicationEvent;

/**
 * Description:
 * Created by nijunyang on 2020/2/20 22:05
 */
public class MyApplicationEvent extends ApplicationEvent {
    /**
     * Create a new ApplicationEvent.
     *
     * @param source the object on which the event initially occurred (never {@code null})
     */
    public MyApplicationEvent(Object source) {
        super(source);
    }
}

配置类:指定要扫描的包事件

package com.nijunyang.spring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @author: create by nijunyang
 * @date:2019/10/6
 */
@Configuration
@ComponentScan(basePackages = "com.nijunyang.spring.*")
public class MainConfig {
}

测试代码:在容器建立完以后发布本身的事件。

package com.nijunyang.spring;

import com.nijunyang.spring.listener.MyApplicationEvent;
import com.nijunyang.spring.model.Student;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
        context.publishEvent(new MyApplicationEvent("想涨工资"));
    }

}

执行代码会发现咱们的监听器会监听到两个事件,由于咱们监听器监听的事件是ApplicationEvent,上面说到容器启动的时候,最后会执行finishRefresh方法发布ContextRefreshedEvent事件,容器启动完成以后,咱们本身手动发布了一个咱们本身的事件,所以会监听到两个事件。

 

 

 修改咱们的监听器,只监听咱们本身的事件:

package com.nijunyang.spring.listener;

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

/**
 * Description:
 * Created by nijunyang on 2020/2/20 21:53
 */
@Component
public class MyListener implements ApplicationListener<MyApplicationEvent> {
    @Override
    public void onApplicationEvent(MyApplicationEvent event) {
        System.out.println("收到事件:" + event.toString());
    }
}

 

 再次执行代码,发现如今就只能监听咱们本身的事件了

 

 

经过spring的监听器,咱们不只能够实现本身相关的业务,还能够经过这个机制将咱们本身的组件和spring进行整合,好比阿里的nacos就是经过ApplicationListener与spring整合的

相关文章
相关标签/搜索