springboot中使用ApplicationListener和ApplicationEvent /@EventListener监听事件
文章目錄
- 自定義一個事件類
- 監(jiān)聽類:
- 事件發(fā)布者
- 改用@EventListener注解:
- 總結(jié)
自定義一個事件類
public class OnRegistrationCompleteEvent extends ApplicationEvent {private final User user;public OnRegistrationCompleteEvent(final User user) {super(user);System.out.println("登錄/注冊了一個"+user.toString());this.user = user;}public User getUser() {return user;} }監(jiān)聽類:
@Component public class EventListener implements ApplicationListener<OnRegistrationCompleteEvent> {@Override@NonNullpublic void onApplicationEvent(OnRegistrationCompleteEvent event) {//事件發(fā)生后回調(diào)的方法System.out.println("監(jiān)聽"+event.getUser().toString());} }事件發(fā)布者
在業(yè)務(wù)層中注入publisher
@Service public class UserServiceImpl implements IUserService { @AutowiredUserMapper userMapper; @Autowired private ApplicationEventPublisher publisher;public ResponseResult insert(User record) {userMapper.insert(record);publisher.publishEvent(new OnRegistrationCompleteEvent(record));return ResponseResult.success(record);}}ApplicationEventPublisher是ApplicationContext的父接口之一。這接口的作用是:Interface that encapsulates event publication functionality.
功能就是發(fā)布事件,也就是把某個事件告訴的所有與這個事件相關(guān)的監(jiān)聽器。
現(xiàn)在插入一條數(shù)據(jù)進(jìn)行測試:
如果刪掉 publisher.publishEvent(new OnRegistrationCompleteEvent(record));這句話會發(fā)現(xiàn)事件并沒有被監(jiān)聽
改用@EventListener注解:
修改上面的監(jiān)聽類,不再繼承ApplicationListener
@Componentpublic class EmailSendListener {@NonNull@EventListener(classes=OnRegistrationCompleteEvent.class)public void onApplicationEvent(OnRegistrationCompleteEvent event) {//事件發(fā)生后回調(diào)的方法System.out.println("監(jiān)聽"+event.getUser().toString());} }再次插入數(shù)據(jù):
一樣可以起到監(jiān)聽作用。
總結(jié)
目前結(jié)論:需要自定義事件,監(jiān)聽者,發(fā)布者。
監(jiān)聽者類需要加@component注解交由spring管理,可以選擇繼承ApplicationEvent 也可以加@EventListener注解的方式
發(fā)布者發(fā)布事件后所有監(jiān)聽器將能接收到信息,回調(diào)監(jiān)聽到以后的方法
基本上牽涉到事件(Event)方面的設(shè)計,就離不開觀察者模式,ApplicationContext 的事件機(jī)制主要通過 ApplicationEvent 和 ApplicationListener 這兩個接口來提供的,和 Java swing 中的事件機(jī)制一樣。即當(dāng) ApplicationContext 中發(fā)布一個事件時,所有擴(kuò)展了 ApplicationListener 的 Bean都將接受到這個事件,并進(jìn)行相應(yīng)的處理。
ApplicationContext 擴(kuò)展了 ResourceLoader(資源加載器)接口,從而可以用來加載多個Resource,而 BeanFactory 是沒有擴(kuò)展 ResourceLoader
總結(jié)
以上是生活随笔為你收集整理的springboot中使用ApplicationListener和ApplicationEvent /@EventListener监听事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot整合shiro和se
- 下一篇: java的格式化时间工具类