Spring中的事件監(jiān)聽器使用學(xué)習(xí)記錄
一、什么是Spring中的事件監(jiān)聽機制?
Spring框架中的事件監(jiān)聽機制是一種設(shè)計模式,它允許你定義和觸發(fā)事件,同時允許其他組件監(jiān)聽這些事件并在事件發(fā)生時作出響應(yīng)。這種機制基于觀察者模式,提供了一種松耦合的方式來實現(xiàn)組件間的通信。
二、Spring事件監(jiān)聽機制的關(guān)鍵概念
1. 事件(Event)
事件是應(yīng)用程序中的一個信號,表明某個動作已經(jīng)發(fā)生或某個條件已經(jīng)滿足。在Spring中,事件通常是實現(xiàn)ApplicationEvent接口的類來表示的。Spring為我們提供了多種內(nèi)置的事件類型,如ContextStartedEvent、ContextRefreshedEvent,ContextCloseEvent、ContextStoppedEvent等事件,分別對應(yīng)于應(yīng)用程序上下文的不同生命周期階段。當然我們也可以自定義自己的事件類型,即:通過實現(xiàn)ApplicationEvent接口或擴展ApplicationEvent類。
2. 事件發(fā)布者(Event Publisher)
事件發(fā)布者負責將事件發(fā)布出去,然后通過Spring的智能事件派發(fā),把發(fā)布的事件派發(fā)給對應(yīng)該事件類型的所有監(jiān)聽器。在Spring中,ApplicationContext自身就是一個事件發(fā)布者(因為ApplicationContext接口繼承了ApplicationEventPublisher接口),它可以發(fā)布應(yīng)用程序事件(比如ContextRefreshedEvent ,ContextCloseEvent等事件)。【通常我們會讓自定義組件實現(xiàn) ApplicationEventPublisherAware接口,然后實現(xiàn)接口中的如下方法把事件發(fā)布者對象注入到組件中】
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}3. 事件監(jiān)聽器(Event Listener)
事件監(jiān)聽器是實現(xiàn)ApplicationListener接口的組件,它們可以監(jiān)聽和響應(yīng)事件。監(jiān)聽器需要實現(xiàn)onApplicationEvent方法,以便在接收到事件時進行處理。此外,Spring給我們提供了一個 @EventListener注解,允許你直接在方法上標注以監(jiān)聽特定類型的事件。當事件發(fā)生時,Spring會自動調(diào)用這些方法。(注意:事件監(jiān)聽器一定要放入IOC容器中才會生效。)
4. 事件傳播
事件可以在不同的Spring容器之間傳播,例如從子容器傳播到父容器。
5. 同步與異步事件
Spring支持同步和異步事件處理。
三、實現(xiàn)一個簡單的事件監(jiān)聽功能
需求描述: 程序中有一個添加用戶的業(yè)務(wù)組件,要求當用戶添加成功時,發(fā)布一個添加用戶成功事件,然后通過添加用戶成功事件的監(jiān)聽器給管理員發(fā)送一封郵件。
1. 業(yè)務(wù)組件
package com.shg.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shg.beans.User;
public interface UserService extends IService<User> {
User addUser(User user);
}
package com.shg.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shg.beans.User;
import com.shg.listener.event.UserAddSuccessEvent;
import com.shg.mapper.UserMapper;
import com.shg.service.UserService;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService, ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
private final UserMapper userMapper;
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User addUser(User user) {
userMapper.insert(user);
applicationEventPublisher.publishEvent(new UserAddSuccessEvent(this, user));
return user;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}2. 添加用戶成功事件
package com.shg.listener.event;
import com.shg.beans.User;
import org.springframework.context.ApplicationEvent;
public class UserAddSuccessEvent extends ApplicationEvent {
private final User user;
public UserAddSuccessEvent(Object source, User user) {
super(source);
this.user = user;
}
public User getUser() {
return user;
}
}3. 添加用戶成功事件監(jiān)聽器
package com.shg.listener;
import com.shg.listener.event.UserAddFailEvent;
import com.shg.listener.event.UserAddSuccessEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
// 實現(xiàn)ApplicationListener接口的方式
// @Slf4j
// @Component
// public class UserAddListener implements ApplicationListener<UserAddSuccessEvent> {
// @Override
// public void onApplicationEvent(UserAddSuccessEvent event) {
// log.info("創(chuàng)建用戶:{}, 成功,已發(fā)送短信給管理員...", event.getUser());
// }
// }
// 使用@EventListener的方式
@Slf4j
@Component
public class UserAddListener {
@EventListener(value = {UserAddSuccessEvent.class})
public void listenerUserAddSuccessEvent(UserAddSuccessEvent event) {
log.info("創(chuàng)建用戶:{}, 成功,已發(fā)送短信給管理員...", event.getUser());
}
}4. 運行結(jié)果

到此這篇關(guān)于Spring中的事件監(jiān)聽器使用學(xué)習(xí)的文章就介紹到這了,更多相關(guān)Spring事件監(jiān)聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解java實現(xiàn)簡單掃碼登錄功能(模仿微信網(wǎng)頁版掃碼)
這篇文章主要介紹了java實現(xiàn)簡單掃碼登錄功能(模仿微信網(wǎng)頁版掃碼),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
簡單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過程
這篇文章主要介紹了簡單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過程,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
Springboot整合Shiro實現(xiàn)登錄與權(quán)限校驗詳細解讀
本文給大家介紹Springboot整合Shiro的基本使用,Apache?Shiro是Java的一個安全框架,Shiro本身無法知道所持有令牌的用戶是否合法,我們將整合Shiro實現(xiàn)登錄與權(quán)限的驗證2022-04-04
SpringBoot項目Jar包如何瘦身部署的實現(xiàn)
這篇文章主要介紹了SpringBoot項目Jar包如何瘦身部署的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

