SpringEvent-轻量级内部组件解耦神器

SpringEvent是允许不同组件之间通过发布-订阅机制进行解耦的通信,可以用来通知其它组件执行后续操作。

一、简单使用

1.创建一个 SpringEvent监听器

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * Event listener
 * @author GodSea
 */
@Component
@Slf4j
public class SpringEventListener {

    @EventListener
    public void eventHandler(String event) {
        log.info("事件处理:{}", event);
    }
}

2.事件发送(单元测试)

@Test
void testEvent() {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    eventPublisher.publishEvent("事件测试");
}

3.执行结果

SpringEvent-轻量级内部组件解耦神器_第1张图片

二、多个监听者

1.监听器

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * Event listener
 * @author GodSea
 */
@Component
@Slf4j
public class SpringEventListener {

    @EventListener
    public void eventHandler1(String event) {
        log.info("事件处理1:{}", event);
    }

    @EventListener
    public void eventHandler2(Integer event) {
        log.info("事件处理2:{}", event);
    }
}

 2.事件发送

@Test
void testEvent() {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    eventPublisher.publishEvent("字符串");
    eventPublisher.publishEvent(21);
    stopWatch.stop();
}

3.执行结果

SpringEvent-轻量级内部组件解耦神器_第2张图片

三、总结

SpringEvent多个监听者是根据数据类型分类的,需要使用多个监听者,则应该使用不同类型的数据发送和监听,如果有相同数据类型的监听者,那么这些监听者都将会接收到事件。

例如:

    // 监听者
    @EventListener
    public void eventHandler1(String event) {
        log.info("事件处理1:{}", event);
    }

    @EventListener
    public void eventHandler2(String event) {
        log.info("事件处理2:{}", event);
    }



    // 事件发送
    @Test
    void testEvent() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        eventPublisher.publishEvent("字符串");
        stopWatch.stop();
    }

执行结果:

SpringEvent-轻量级内部组件解耦神器_第3张图片

如果监听者需要异步执行,例如一些业务处理后的数据更新,这些数据更新用户侧暂时不关注,则只需异步执行事件,想要实现这种异步执行,只需借助注解@Async即可实现。

例如:

    //  监听者
    @EventListener
    @Async
    public void eventHandler1(String event) {
        log.info("事件处理1:{}", event);
    }

    @EventListener
    public void eventHandler2(Integer event) {
        log.info("事件处理2:{}", event);
    }



    // 事件发送
    @Test
    void testEvent() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        eventPublisher.publishEvent("字符串");
        log.info("事件 1 已发送");
        eventPublisher.publishEvent(21);
        log.info("事件 2 已发送");
        stopWatch.stop();
    }

执行结果:   事件1使用了异步执行

SpringEvent-轻量级内部组件解耦神器_第4张图片

你可能感兴趣的:(java,spring,boot)