天天看点

Spring Boot 2关于ApplicationEvent的使用自定义线程池处理通过@EventListener处理实现ApplicationListener接口自定义监听实现SmartApplicationListener接口自定义监听

Spring Boot 2关于ApplicationEvent的使用

  • 自定义线程池处理
  • 通过@EventListener处理
  • 实现ApplicationListener接口自定义监听
  • 实现SmartApplicationListener接口自定义监听

ApplicationEvent与Listener是Spring提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是解耦。

自定义线程池处理

public String test1() {
    taskExecutorConfig.getAsyncExecutor().execute(() -> {
        //
    });
    return "test1";
}
           
将非主干逻辑放到后台线程处理,不影响主线程的业务执行时间

通过@EventListener处理

@Component
public class AnnotationRegisterListener {
	 @EventListener
    public void test2(Test1ApplicationEvent event) {
        //
    }
    @EventListener
    public void test2(Test2ApplicationEvent event) {
        //
    }
}

applicationContext().publishEvent(new Test2ApplicationEvent(this, "test2"));
           
通过注解方式实现对不同event的监听,不用自定义监听类

实现ApplicationListener接口自定义监听

@Component
public class Test3ApplicationListener implements ApplicationListener<Test3ApplicationEvent> {
    @Override
    public void onApplicationEvent(Test3ApplicationEvent event) {
        //
    }
}

applicationContext().publishEvent(new Test3ApplicationEvent(this, "test3"));
           
通过自定义监听类实现对不同event的监听

实现SmartApplicationListener接口自定义监听

@Component
public class Test4SmartApplicationListener implements SmartApplicationListener {
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == Test4ApplicationEvent.class;
    }
    @Override
    public boolean supportsSourceType(Class<?> sourceType) {
        return sourceType == TestServiceImpl.class;
    }
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        Test4ApplicationEvent test4ApplicationEvent = (Test4ApplicationEvent) event;       
    }
    @Override
    public int getOrder() {
        return 1;
    }
}

applicationContext().publishEvent(new Test4ApplicationEvent(this, "test4"));
           
SmartApplicationListener接口继承了全局监听ApplicationListener,监听所有事件发布。这里需要指定event类型以及source类型,才能精确监听到自己想要的

源码位置:

https://gitee.com/ceclar123/spring-boot-demo/tree/master/ch09