首页 > 其他分享 >Spring的事件驱动模型

Spring的事件驱动模型

时间:2023-06-03 10:11:46浏览次数:29  
标签:LoginEvent Spring 模型 springframework 事件驱动 import org public

作用

在传统企业级Spring应用系统中,正是通过事件驱动模型实现信息的异步通信和业务模块的解耦

组成

包括发送消息的生产者、消息(或事件)和监听接收消息的消费者,这三者是绑定在一起的,可以说是“形影不离”

实现步骤(案例)

(1)需要创建用户登录成功后的事件实体类 LoginEvent,该实体类需要继承ApplicationEvent并实现序列化机制

        //导入包
        import lombok.Data;
        import lombok.ToString;
        import org.springframework.context.ApplicationEvent;
        import java.io.Serializable;
        /**
         * 用户登录成功后的事件实体
         * @Author:debug (SteadyJack)
         **/
        @Data
        @ToString
        public class LoginEvent extends ApplicationEvent implements Serializable{
            private String userName;              //用户名
            private String loginTime;             //登录时间
            private String ip; //所在IP
            //构造方法一
            public LoginEvent(Object source) {
              super(source);
            }
            //构造方法二:这是在继承ApplicationEvent类时需要重写的构造方法
            public LoginEvent(Object source, String userName, String loginTime,
        String ip) {
                super(source);
                this.userName = userName;
                this.loginTime = loginTime;
                this.ip = ip;
            }
        }

(2)开发监听消息的消费者Consumer类,该类需要实现ApplicationListener接口并绑定事件源LoginEvent

        //导入包
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import org.springframework.context.ApplicationListener;
        import org.springframework.scheduling.annotation.Async;
        import org.springframework.scheduling.annotation.EnableAsync;
        import org.springframework.stereotype.Component;
        /**Spring的事件驱动模型-消费者
         * @Author:debug (SteadyJack)
        **/
        @Component  //加入Spring的IOC容器
        @EnableAsync //允许异步执行
        public class Consumer implements ApplicationListener<LoginEvent>{
            //定义日志
            private static final Logger log= LoggerFactory.getLogger(Consumer.
        class);
            /**
            * 监听消费消息
            * @param loginEvent
            */
            @Override
            @Async
        public void onApplicationEvent(LoginEvent loginEvent) {
          //打印日志信息
              log.info("Spring事件驱动模型-接收消息:{}", loginEvent);
              //TODO:后续为实现自身的业务逻辑-比如写入数据库等
            }
        }

(3)开发用于发送消息或产生事件的生产者 Producer,通过 Spring内置的ApplicationEventPublisher组件实现消息的发送

        //导入包
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.context.ApplicationEventPublisher;
        import org.springframework.stereotype.Component;
        import java.text.SimpleDateFormat;
        import java.util.Date;
        /**Spring的事件驱动模型-生产者
         * @Author:debug (SteadyJack)
        **/
        @Component
        public class Publisher {
            //定义日志
            private static final Logger log= LoggerFactory.getLogger(Publisher.
        class);
            //定义发送消息的组件
            @Autowired
            private ApplicationEventPublisher publisher;
            //发送消息的方法
        public void sendMsg() throws Exception{
            //构造 登录成功后用户的实体信息
              LoginEvent event=new LoginEvent(this, "debug", new SimpleDateFormat
        ("yyyyy-MM-dd HH:mm:ss").format(new Date()), "127.0.0.1");
            //发送消息
        publisher.publishEvent(event);
              log.info("Spring事件驱动模型-发送消息:{}", event);
            }
        }

(4)测试方法

        //导入包
        import com.debug.middleware.server.MainApplication;
        import com.debug.middleware.server.event.Publisher;
        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
        /**定义Java单元测试类
         * @Author:debug (SteadyJack)
        **/
        @RunWith(SpringJUnit4ClassRunner.class)
        @SpringBootTest
        public class EventTest {
            //自动装配生产者实例
            @Autowired
            private Publisher publisher;
            //Java单元测试方法
            @Test
        public void test1() throws Exception{
            //调用发送消息的方法产生消息
              publisher.sendMsg();
            }
        }

标签:LoginEvent,Spring,模型,springframework,事件驱动,import,org,public
From: https://www.cnblogs.com/zhu12/p/17453367.html

相关文章

  • R语言APRIORI模型关联规则挖掘分析脑出血急性期用药规律最常配伍可视化|附代码数据
    最近我们被客户要求撰写关于关联规则的研究报告,包括一些图形和统计输出。本文帮助客户运用关联规则方法分析中医治疗脑出血方剂,用Apriori模型挖掘所选用的主要药物及其用药规律,为临床治疗脑出血提供参考脑出血急性期用药数据读取数据a_df3=read.xlsx("脑出血急性期用药最常配伍......
  • 扩散模型 - Stable Diffusion
    4StableDiffusionStableDiffusion是由StabilityAI开发的开源扩散模型。StableDiffusion可以完成多模态任务,包括:文字生成图像(text2img)、图像生成图像(img2img)等。4.1StableDiffusion的组成部分 StableDiffusion由两部分组成:文本编码器:提取文本prompt的信息图像生成......
  • matlab中通过ode函数求解常微分方程附加简单的钟摆模型
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 扩散模型 - Stable Diffusion
    4StableDiffusion​ StableDiffusion是由StabilityAI开发的开源扩散模型。StableDiffusion可以完成多模态任务,包括:文字生成图像(text2img)、图像生成图像(img2img)等。4.1StableDiffusion的组成部分​ StableDiffusion由两部分组成:文本编码器:提取文本prompt的......
  • R语言GARCH族模型:正态分布、t、GED分布EGARCH、TGARCH的VaR分析股票指数|附代码数据
    全文链接:http://tecdat.cn/?p=31023最近我们被客户要求撰写关于GARCH族模型的研究报告,包括一些图形和统计输出。如何构建合适的模型以恰当的方法对风险进行测量是当前金融研究领域的一个热门话题 ( 点击文末“阅读原文”获取完整代码数据******** )。VaR方法作为当前业内比较......
  • NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据|附代码数据
    全文链接:http://tecdat.cn/?p=2155最近我们被客户要求撰写关于NLP自然语言处理的研究报告,包括一些图形和统计输出。随着网民规模的不断扩大,互联网不仅是传统媒体和生活方式的补充,也是民意凸显的地带。领导干部参与网络问政的制度化正在成为一种发展趋势,这种趋势与互联网发展的时......
  • Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用|附代码数据
    原文链接:http://tecdat.cn/?p=24407最近我们被客户要求撰写关于金融时间序列模型的研究报告,包括一些图形和统计输出。这篇文章讨论了自回归综合移动平均模型(ARIMA)和自回归条件异方差模型(GARCH)及其在股票市场预测中的应用 ( 点击文末“阅读原文”获取完整代码数据******......
  • Generative AI 新世界 | 大型语言模型(LLMs)概述
    在上一篇《GenerativeAI新世界:文本生成领域论文解读》中,我带领大家一起梳理了文本生成领域(TextGeneration)的主要几篇论文:InstructGPT,RLHF,PPO,GPT-3,以及GPT-4。本期文章我将帮助大家一起梳理另一个目前炙手可热的话题:大型语言模型(LargeLanguageModels,或简写为LLMs)。亚马......
  • 基于JAVA的springboot篮球论坛系统,附源码+数据库+论文+PPT
    1、项目介绍考虑到实际生活中在篮球论坛方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页、个人中心、用户管理、篮球论坛、系统管理等功能。管理员用例图如图3-1所示。(b)用户;用户使用本系统......
  • 数据不够怎么训练深度学习模型?不妨试试迁移学习 ——重用神经网络的结构2
    数据不够怎么训练深度学习模型?不妨试试迁移学习本质就是这个图!pretrainedmodel就是你截取的部分神经网络模型(迁移学习),而nanonet就是你自己加入的网络层。随着深度学习技术在机器翻译、策略游戏和自动驾驶等领域的广泛应用和流行,阻碍该技术进一步推广的一个普遍性难题也日渐凸显:训......