Spring 中的事件

spring 中的事件

说到事件,可能脑海中最先浮现的就是 “订阅-发布”模式。通俗点讲日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作。

Java中提供了基本的事件处理基类:

  1. EventObject:所有事件状态对象都将从其派生的根类;
  2. EventListener:所有事件侦听器接口必须扩展的标记接口;

Spring 中的事件机制

在 Spring 容器中通过 ApplicationEvent 类和 ApplicationListener 接口来处理事件,如果某个 bean实现 ApplicationListener 接口并被部署到容器中,那么每次对应的 ApplicationEvent 被发布到容器中都会通知该 bean ,这是典型的观察者模式。

Spring 的事件默认是同步的,即调用 publishEvent 方法发布事件后,它会处于阻塞状态,直到 onApplicationEvent 接收到事件并处理返回之后才继续执行下去,这种单线程同步的好处是可以进行事务管理。

我们使用一个示例,用户登录,发送消息给用户

1、先定义一个事件

package com.hzau.eventstudy.event;

import org.springframework.context.ApplicationEvent;

/**
 * @ClassName UserLoginEvent
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/8/11 16:01
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/
public class UserLoginEvent extends ApplicationEvent {
    public UserLoginEvent(Object source) {
        super(source);
    }
}

2、创建监听器监听这个事件

package com.hzau.eventstudy.event;

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

/**
 * @ClassName SendMsgUserListener
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/8/11 16:03
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/
@Component
public class SendMsgUserListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(UserLoginEvent userLoginEvent) {
        Object source = userLoginEvent.getSource();
        User user= (User) source;
        System.out.println("向"+user.getName()+"----"+user.getPhone()+"===发生消息");
    }
}

3、用户登录时触发

package com.hzau.eventstudy.event;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;

/**
 * @ClassName UserLoginService
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/8/11 16:05
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/
@Service
public class UserLoginService implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher applicationEventPublisher;
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public void insert(User user){
        UserLoginEvent event = new UserLoginEvent(user);
        applicationEventPublisher.publishEvent(event);
    }
}

测试

进行单元测试

package com.hzau.eventstudy;

import com.hzau.eventstudy.event.User;
import com.hzau.eventstudy.event.UserLoginService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
class EventStudyApplicationTests {

    @Resource
    private UserLoginService userLoginService;
    @Test
    void contextLoads() {
        User user =new User();
        user.setName("张三");
        user.setPhone("155245655");
        userLoginService.insert(user);
    }

}

 

Spring 中的事件_第1张图片

接收成功。 

你可能感兴趣的:(spring)