Spring事件Event详解

Spring Event详解 Spring Event是Spring框架内建的一种发布/订阅(Publish-Subscribe)模式的实现,它允许应用内部不同组件之间通过事件进行通信。当某个特定事件发生时,系统中对这类事件感兴趣的监听器可以接收到通知并执行相应操作。 阅读详情

目录

一、Spring的事件机制核心组件

二、Spring事件的基本步骤

三、ApplicationEventMulticaster

四、Spring event事件使用场景 


Spring框架提供了事件驱动的编程模型,使开发者可以在应用程序中实现松耦合的组件通信。

一、Spring的事件机制核心组件

  1. 事件(Event): 事件是应用程序中发生的某种事情,可以是用户行为、系统状态改变等。在Spring中,事件通常表示为一个Java类,它包含了与事件相关的信息。

  2. 事件监听器(Event Listener): 事件监听器是一段代码,它等待并响应事件的发生。在Spring中,事件监听器通常实现了ApplicationListener接口,该接口定义了监听事件的方法。

  3. 事件发布器(Event Publisher): 事件发布器负责发布事件,通知所有监听该事件的监听器。在Spring中,ApplicationEventPublisher接口表示事件发布器,可以通过Spring容器自动注入或手动获取。

Spring的事件机制遵循“观察者模式”(Observer Pattern),其中事件发布器充当主题(Subject),事件监听器充当观察者(Observer)。

二、Spring事件的基本步骤

  1. 创建自定义事件类,继承ApplicationEvent。
  2. 创建事件监听器,实现ApplicationListener接口。
  3. 在事件监听器中处理事件。
  4. 使用事件发布器发布事件。
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.event.EventListener;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.context.event.SourceFilteringListener;
import org.springframework.stereotype.Component;

// 步骤1: 创建自定义事件类
class CustomEvent extends ApplicationEvent {
    private String message;

    public CustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

// 步骤2: 创建事件监听器
@Component
class CustomEventListener implements ApplicationListener<CustomEvent> {
    // 步骤3: 在监听器中处理事件
    @Override
    public void onApplicationEvent(CustomEvent event) {
        System.out.println("Received custom event: " + event.getMessage());
    }
}

public class EventDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(EventDemo.class);

        // 步骤4: 使用事件发布器发布事件
        context.publishEvent(new CustomEvent(context, "Hello, Spring Events!"));

        context.close();
    }
}

在上面的示例中,我们创建了一个自定义事件类CustomEvent,一个事件监听器CustomEventListener来监听这个事件,并在EventDemo类中使用事件发布器发布了一个CustomEvent事件。当事件被发布时,监听器会接收到事件并执行相应的操作。

除了实现ApplicationListener接口,Spring还提供了更简化的方式来定义事件监听器,例如使用@EventListener注解或使用ApplicationEventMulticaster自定义事件的分发策略。

Spring的事件机制可用于解耦应用程序的不同部分,使得组件之间更容易协作。

三、ApplicationEventMulticaster

ApplicationEventMulticaster是Spring框架中的一个重要组件,用于事件的多播(Multicast)和分发。它允许应用程序中的事件监听器订阅和响应事件。ApplicationEventMulticaster的主要作用是管理和调度事件监听器,确保事件在发布时正确传递给监听器。

以下是关于ApplicationEventMulticaster的一些重要信息和用法:

  1. 多播(Multicast): ApplicationEventMulticaster负责将事件广播给所有已注册的监听器。这意味着事件可以被多个监听器同时接收和处理。

  2. 注册监听器: 开发者可以通过ApplicationEventMulticaster的方法来注册监听器,通常是通过Spring容器的上下文来完成。监听器可以通过实现ApplicationListener接口来定义,并在Spring配置中进行注册。

  3. 事件分发: 当应用程序中的某个事件被发布(通过ApplicationEventPublisher),ApplicationEventMulticaster将负责将事件分发给所有已注册的监听器。

  4. 同步和异步事件: Spring支持同步和异步事件处理。通过配置不同的ApplicationEventMulticaster实现,可以选择同步或异步的事件分发策略。

  5. 默认实现: Spring提供了默认的SimpleApplicationEventMulticaster实现,它是同步的,按照注册顺序通知监听器。对于大规模的应用,可以使用不同的ApplicationEventMulticaster实现,如ThreadPoolTaskExecutor,以实现异步事件处理。

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

class CustomEvent extends ApplicationEvent {
    private String message;

    public CustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

class CustomEventListener implements ApplicationListener<CustomEvent> {
    @Override
    public void onApplicationEvent(CustomEvent event) {
        System.out.println("Received custom event: " + event.getMessage());
    }
}

public class EventDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(EventDemo.class);

        // 创建并配置一个ThreadPoolTaskExecutor作为事件分发器
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setThreadNamePrefix("event-thread-");
        taskExecutor.initialize();

        // 创建一个SimpleApplicationEventMulticaster并设置任务执行器
        ApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster();
        eventMulticaster.setTaskExecutor(taskExecutor);

        // 注册事件监听器
        CustomEventListener listener = new CustomEventListener();
        context.addApplicationListener(listener);

        // 使用自定义事件分发器发布事件
        eventMulticaster.multicastEvent(new CustomEvent(context, "Hello, Spring Events!"));

        context.close();
    }
}

 在例子中,我们手动创建了一个SimpleApplicationEventMulticaster作为事件分发器,并配置了一个ThreadPoolTaskExecutor来实现异步事件处理。然后,我们注册了一个事件监听器,并使用eventMulticaster.multicastEvent(...)方法发布了一个自定义事件。事件将被异步分发给监听器,以实现并发处理。请注意,Spring也支持在XML配置中配置ApplicationEventMulticaster和线程池。

四、Spring event事件使用场景 

Spring事件(Spring Events)是一种用于实现组件之间松散耦合的方式,它允许一个组件(事件发布者)发布事件,而其他组件(事件监听器)可以订阅并响应这些事件。Spring事件在很多场景下都非常有用,以下是一些常见的使用场景:

  1. 用户界面反馈: 在Web应用程序中,可以使用Spring事件来处理用户界面反馈。例如,当用户提交一个表单时,可以发布一个事件,然后前端界面组件(如消息通知组件)可以监听该事件以显示成功或错误消息。

  2. 日志记录: 在应用程序中,可以使用Spring事件来记录重要的操作和事件。例如,当某个重要操作完成时,可以发布一个事件,然后日志记录组件可以监听该事件以生成相应的日志记录。

  3. 异步处理: Spring事件可用于实现异步处理,以提高系统的性能和响应时间。例如,在后台处理大量数据时,可以将数据处理任务发布为事件,然后异步处理器可以监听并处理这些事件。

  4. 通知和触发: 事件可以用于通知其他组件某些状态或条件的变化。例如,在系统中某个重要的状态变化时,可以发布事件,然后其他组件可以监听该事件并执行相应的操作。

  5. 解耦组件: Spring事件帮助解耦应用程序中的各个组件,使它们不需要直接调用彼此的方法。这有助于提高代码的可维护性和可扩展性。

  6. 定时任务触发: 可以使用Spring事件来触发定时任务的执行。例如,定时任务调度器可以监听事件,并在特定事件发生时执行任务。

  7. 领域驱动设计(DDD): 在DDD中,Spring事件可用于实现领域事件,用于通知领域中的不同聚合根或领域服务发生的变化。

  8. 分布式系统协作: 在分布式系统中,Spring事件可以用于协调不同服务之间的操作。例如,一个服务可以发布一个事件来通知其他服务某个操作已完成。

总之,Spring事件是一种强大的工具,可以用于在应用程序中实现松耦合的组件通信,提高代码的可维护性和可扩展性。根据应用程序的需求,可以灵活地使用Spring事件来处理各种不同的场景。

带你吃透 Spring 框架中的事件处理机制 在现代应用程序中,各个组件之间的通信是至关重要的。想象一下,你的应用程序中的各个模块像是一个巨大的交响乐团,每个模块都是一位音乐家,而Spring事件机制就像是指挥家,将所有音乐家协调得天衣无缝。这种松耦合的通信方式使你的应用程序更加灵活、可维护,而且能够轻松应对变化。现在,让我们进入这个令人兴奋的音乐厅,探索Spring事件的世界。在Spring框架中,事件(Events)是一种基本概念,用于实现松耦合的通信方式,允许不同组件之间进行相互通知和协作。 阅读详情

相关推荐

【SpringBoot 3.x 第94节】Spring 事件驱动模型详解(Event-Driven),一文带你搞透!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。 该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 499

对SpringEvent 最全面的讲解

Spring Event(解耦神器) 是 Spring 框架中的一个事件机制,用于实现应用程序内部的事件传递和处理。通常情况下,当应用程序需要响应某些特定事件时,可以使用 Spring Event 来实现。

SunBigBoy的博客 5075

Spring Event实战:从订单解耦到事务与异步事件踩坑指南

在业务系统中,核心链路与附加逻辑的强耦合往往会导致代码臃肿、性能下降。事件驱动架构通过将“发生的事实”与“后续处理”分离,成为解决这一问题的有效手段。Spring Event作为Spring框架内建的事件机制,基于观察者模式实现进程内解耦,无需引入额外中间件即可使用。它由事件对象、发布器与监听器三部分组成,发布者只需发布事件,监听器按需响应,从而降低模块间的依赖。结合@TransactionalEventListener可精准控制事务提交后的处理时机,配合线程池与@Async则能实现异步化,提升接口响应速度

weixin_42548893的博客 329

Spring的Event

心静听炊烟

weixin_45874214的博客 3470

10BASE-T1S协议中的PLCA机制:实现无碰撞网络传输的关键

本文深入解析了10BASE-T1S协议中的PLCA(物理层冲突避免)机制。作为IEEE 802.3cg标准的关键部分,PLCA通过循环调度与机会传递,从根源上避免了网络碰撞,为工业与汽车等场景提供了确定性的低延迟传输保障,是实现可靠实时通信的核心技术。

weixin_29250403的博客 209

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 971

Spring事件

Spring事件

qq_37705525的博客 1927

从Google到LLVM:5种主流clang-format预设风格横向对比(含代码对比图)

本文横向对比了LLVM、Google、Chromium、Mozilla和WebKit五种主流的clang-format预设代码风格。通过同一段C++代码的格式化效果对比图,直观展示了它们在指针对齐、大括号换行、缩进等关键细节上的差异,并提供了基于团队背景与项目基因的选型决策指南。

weixin_28828243的博客 442

Spring的Event事件处理使用详解

Spring中使用事件非常简单,只需要以下的几个步骤: 1.定义事件,继承ApplicationEvent 2.定义监听,要么实现ApplicationListener接口,要么在方法上添加@EventListener注解 3.发布事件,调用ApplicationContext.publishEvent()或者ApplicationEventPublisher.publishEvent(); 下面我们就用一个例子来说下具体的用法: 比如用户注册成功以后,系统要给用户发送一封邮件,同时还要给用户发放优惠券,

若鱼的专栏 7804

RS422总线

①.RS422发送驱动器无高阻三态(浮空)状态RS422收发芯片,发送脚固定强驱动输出,永远钳位 A/B 差分电平,不能关断、不能悬空,只要芯片上电,TX+、TX - 就强制输出互补电压(一路高、一路低)。多条发送并联在同一组差分线上:两个驱动器一个拉 A 高、一个拉 A 低,B 线反向拉扯 → 电源→地大电流对灌,瞬间芯片过流发烫烧毁、总线电平短路错乱。注意:RS485 带DE/RE 收发使能脚:不用发送时可关闭驱动器,输出变成高阻浮空,让出总线,因此能多节点分时发送。③.多点通信方式,一主多从方式;

zhuimeng_1234的博客 222

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

Spring事件详解,Spring-Event源码详解,一文搞透Spring事件管理

(1)扩展 org.springframework.context.ApplicationEvent/*** 自定义 Spring 事件/*** @param message 事件消息} }/*** 自定义 Spring 事件/*** @param message 事件消息} }/*** 自定义 Spring 事件/*** @param message 事件消息} }/*** 自定义 Spring 事件/*** @param message 事件消息。

秃了也弱了 1906

某商场G区火灾自动报警与控制系统设计

某商场G区火灾自动报警与控制系统设计 摘要:随着我国经济建设的迅速发展,人民生活水平不断提高,城市用地日益紧张,促使建筑物正朝着高层化、密集化方向发展。高层建筑的特点决定其火灾的危险性和高层建筑的火灾自动报警系统的重要性,一套完整的火灾自动报警及联动控制系统是高层建筑发生火灾时人们生命财产的有利保障,是能否快速准确地发现火情,把火灾扑灭在萌芽状态的关键所在。文章通过消防设计,论述了火灾自动报警及消...

weixin_44026784的博客 5366

spring事件监听机制Event 详解

Spring的事件(Application Event)为Bean和Bean之间的消息同步提供了支持。什么事同步监听呢,举个列子就比如我们洗澡和烧水,同步的意思就是我们必须洗完澡才能进行烧水的,在spring事件发布中,就必须等我们的监听器监听完成代码才可以往下执行。Spring Event 的好处在于,通过事件的发布和监听机制,能够将不同业务之间的耦合度降到最低,这些业务之间并不是直接的调用关系,而是通过事件这种松耦合的方式进行交互,这样业务之间的耦合度就会变得更加灵活和可扩展。

m0_56362438的博客 796

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2727

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

Spring Event 事件发布/监听机制 详解并使用

Spring的事件监听(也叫事件驱动)是观察者模式的一种实现,只要是观察者模式,就含有主题(针对该主题的事件),发布者(发布主题或事件),订阅者(监听主题的人)。有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。 作用: 使用事件机制我们可以将相互耦合的代码解耦,从而方便功能拓展和调整。 1. 观察者模式简介 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。 比如,当一个对象被修改时,则会自动通知它的依赖

你若为我繁华,我愿成你烟花 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java @event,Spring事件Application Event原理详解

这篇文章主要介绍了Spring 事件Application Event原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Spring 的事件(Application Event)为 Bean 与 Bean 之间的消息通信提供了支持。当一个 Bean 处理完一个任务之后,希望另一个 Bean 知道并能做相应的处理,这时我们就需要让另一个 Bea...

weixin_32083393的博客 762

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

工业物联网实战:基于 Eclipse Paho + Spring Event 的 MQTT 事件驱动接入全链路解析

本文介绍了一个基于Eclipse Paho和Spring Event的工业物联网MQTT接入层实现方案。文章首先分析了传统HTTP在物联网场景下的局限性,阐述了MQTT协议的长连接、发布/订阅模型等核心优势。随后详细讲解了系统架构设计,采用分层解耦思想,包含回调适配层、接入编排层和事件桥梁层。在实现层面,重点介绍了可外部化配置管理、客户端生命周期管理(包括唯一ClientId生成和线程安全连接)、消息处理机制(含保留消息过滤和重连策略),以及通过Spring Event实现业务解耦的方案。

xwhxy的博客 472

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Microservices Event Sourcing详解:如何用Spring Boot构建最终一致性的微服务架构

Microservices Event Sourcing是一个基于微服务架构的在线购物网站,采用Spring Boot、Spring Cloud、Spring Reactor、OAuth2和CQRS等技术构建,实现了基于Event Sourcing的最终一致性,为开发者提供了构建端到端微服务的最佳实践。 ## 一、项目架构概览:微服务与事件溯源的完美结合 ✨ 该项目采用领域驱动设计(DDD)思

gitblog_01156的博客 417

为什么选择Microservices Event Sourcing?CQRS模式与事件溯源实战指南

Microservices Event Sourcing是一个基于微服务架构的在线购物网站解决方案,采用Spring Boot、Spring Cloud等技术栈构建,通过事件溯源(Event Sourcing)实现最终一致性,为开发者提供了构建端到端微服务的最佳实践。本文将深入解析事件溯源与CQRS模式的核心优势,以及如何在实际项目中落地这些架构设计理念。 ## 微服务架构的终极挑战:数据一致性

gitblog_01040的博客 360

别再乱用观察者模式了!用Spring Event优雅解耦业务逻辑(附用户登录案例)

本文探讨了如何利用Spring Event优雅解耦业务逻辑,以用户登录案例为例,展示了从硬编码到事件驱动的升级过程。通过ApplicationEvent、ApplicationEventPublisher和@EventListener的三层架构,实现业务逻辑的高效解耦和异步处理,提升系统性能和可维护性。

weixin_30448603的博客 302

freeCodeCamp 免费编程学习指南:6 大认证 + 1.6 万道交互挑战的完整通关路径

想花 0 元拿下一份雇主点开就能验证的全栈开发证明?freeCodeCamp 把从 HTML 到 Python、数据库、后端 API 的完整免费学习路径开源了出来:16,000 多道交互式编程挑战加 6 张免费认证,写完代码就能直接附进简历。 ## 一个开源仓库里装下了什么 这个仓库是 freeCodeCamp.org 学习平台的完整开源代码与课程数据,背后是一家靠捐款维持的 501(c)(3

gitblog_00284的博客 413

postgresql-event-sourcing并发控制详解:乐观锁与事件订阅机制

在分布式系统中,并发控制是确保数据一致性的关键挑战。postgresql-event-sourcing作为基于PostgreSQL和Spring Boot构建的事件溯源系统参考实现,提供了强大的乐观锁和事件订阅机制来解决这一问题。本文将深入解析这两种核心机制的工作原理及实践应用。 ## 乐观锁:轻量级并发控制的黄金法则 乐观锁是postgresql-event-sourcing处理并发更新的核

gitblog_00909的博客 1012

革命性微服务架构event-sourcing-examples:事件溯源+CQRS完整指南

事件溯源和CQRS是现代微服务架构中的革命性设计模式,它们彻底改变了我们构建可扩展、高可用分布式系统的方式。event-sourcing-examples项目是一个完整的银行转账示例应用,展示了如何在实际项目中实现这些先进架构模式。这个项目不仅提供了Java Spring和Scala Spring两个版本,还包含了完整的微服务实现,是学习现代分布式系统架构的绝佳资源。 ## 🔥 为什么事件溯源

gitblog_00453的博客 718

postgresql-event-sourcing快照机制:提升事件溯源性能的关键技巧

事件溯源(Event Sourcing)是一种强大的架构模式,它通过存储实体的所有变更事件而非最终状态来构建系统。然而,随着事件数量的增长,重建聚合根状态可能变得缓慢。postgresql-event-sourcing项目提供了基于PostgreSQL的事件溯源实现,其中的快照机制是解决性能问题的关键技术。本文将深入探讨快照机制的工作原理、实现方式以及如何在实际项目中应用这一技术提升系统性能。

gitblog_01146的博客 530
上一篇: 面试系列 - Java常见算法(二)
下一篇: SpringBatch作业存储和元数据(BatchConfigurer)详解
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值