【详细学习SpringBoot核心源码之监听器原理-5(观察者设计模式、初始化并加载监听器核心流程、事件的发布器核心流程、SpringBoot中默认的监听器以及默认的事件类型)】

springboot事件监听机制实现与原理(七) spring事件监听器原理 阅读详情

一.知识回顾

【0.SpringBoot专栏的相关文章都在这里哟,后续更多的文章内容可以点击查看】
【1.SpringBoot初识之Spring注解发展流程以及常用的Spring和SpringBoot注解】
【2.SpringBoot自动装配之SPI机制&SPI案例实操学习&SPI机制核心源码学习】
【3.详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
【4.详细学习SpringBoot自动装配原理之自定义手写Starter案例实操实战-2】
【5.IDEA中集成SpringBoot源码环境详细步骤讲解】
【6.初识SpringBoot核心源码之SpringApplication构造器以及run方法主线流程-3】
【7.详细学习SpringBoot核心源码之SpringApplication构造器&Run方法源码详细流程-4】

二.观察者设计模式

在学习SpringBoot源码的监听器之前,我们必须提前学习一下观察者设计模式,观察者设计模式在我之前写过的设计模式专栏中详细讲解过,大家先去学习一下观察者设计模式,然后我们再来学习一下SpringBoot监听器就会更加明白了。话不多说,上链接。
【Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式】

下面这几句话很重要:
发布器相当于是观察者设计模式当中的主题,监听器listener相当于是观察者设计模式当中的observer,每一个listener用来监听不同的事件。
发布器中有一个集合专门用来存储所有的listener,发布器发布事件的本质就是遍历属性集合,执行每一个listener中的onApplicationEvent()方法。

三.SpringBoot源码之监听器设计

3.1 初始化并加载监听器

之前的文章我们学习过在SpringApplication的构造方法中会加载所有声明在spring.factories中的监听器。
在这里插入图片描述

SpringApplication中初始化并加载所有监听器的核心逻辑代码

/**
	 * Create a new {@link SpringApplication} instance. The application context will load
	 * beans from the specified primary sources (see {@link SpringApplication class-level}
	 * documentation for details. The instance can be customized before calling
	 * {@link #run(String...)}.
	 * @param resourceLoader the resource loader to use
	 * @param primarySources the primary bean sources
	 * @see #run(Class, String[])
	 * @see #setSources(Set)
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
		// 传递的resourceLoader为null
		this.resourceLoader = resourceLoader;
		Assert.notNull(primarySources, "PrimarySources must not be null");
		// 记录主方法的配置类名称
		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		// 记录当前项目的类型
		this.webApplicationType = WebApplicationType.deduceFromClasspath();
		// 加载配置在spring.factories文件中的ApplicationContextInitializer对应的类型并实例化
		// 并将加载的数据存储在了 initializers 成员变量中。
		setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
		// 初始化监听器 并将加载的监听器实例对象存储在了listeners成员变量中
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		// 反推main方法所在的Class对象 并记录在了mainApplicationClass对象中
		this.mainApplicationClass = deduceMainApplicationClass();
	}

setListeners为核心方法
在这里插入图片描述
通过debug我们可以知道加载的监听器就是key为ApplicationListener.class的所有监听器,默认加载的11个监听器
在这里插入图片描述
在这里插入图片描述

3.2 SpringApplication.run()方法中获取所有发布事件的发布器

核心方法getRunListeners
在这里插入图片描述

run方法中获取事件发布器的方法getRunListeners()
在这里插入图片描述

进入getRunListeners方法
在这里插入图片描述

进入getSpringFactoriesInstances方法,并传入SpringApplicationRunListener.class类对象
在这里插入图片描述

spring.factories文件中对应的SpringApplicationRunListener事件发布器

在这里插入图片描述
实例化操作就会执行EventPublishingRunListener.
image.png

回退并进入SpringApplicationRunListeners方法,将从配置文件中加载的集合放入到属性集合当中去。
在这里插入图片描述

接下来就是一个小转折,发布器发布事件,监听器监听到发布的事件并作出相关的逻辑操作

首先我们学习的就是项目启动后,发布器发布事件的主入口方法
在这里插入图片描述

进入starting方法,挨个遍历我们的发布器,并去发布相关的事件

在这里插入图片描述

进入其中的重载构造方法,starting()
在这里插入图片描述

再进入它的实现方法。
在这里插入图片描述

然后再进入multicastEvent方法,传入ApplicationStartingEvent类型的事件

在这里插入图片描述

然后执行重载的方法,监听器的同步和异步调用,我们可以看到具体的触发逻辑

在这里插入图片描述

image.png
继续进入invokeListener方法,查看具体逻辑
在这里插入图片描述

需要继续进入doInvokeListener方法,查看具体逻辑操作。
在这里插入图片描述
学源码必须刨根问题,所以我们需要进入到ApplicationListener接口一探究竟。
在这里插入图片描述

跟到这里,后面的事件发布与监听器的处理逻辑就差不多是一致了。到这儿对应SpringBoot中的监听器这块就分析的差不多了。下篇文章我们将要学习的就是SpringBoot的核心配置文件,SpringBoot的属性文件中的信息什么时候加载的就是在这些内置的监听器中完成的。

四.SpringBoot中默认的监听器以及默认的事件类型

4.1 SpringBoot中默认的监听器

SpringBoot中给我们提供的默认的监听器,这些都定义在spring.factories文件中。

监听器监听事件说明
ClearCachesApplicationListenerContextRefreshedEvent当触发ContextRefreshedEvent事件会清空应用的缓存
ParentContextCloserApplicationListenerParentContextAvailableEvent触发ParentContextAvailableEvent事件会完成父容器关闭的监听器
CloudFoundryVcapEnvironmentPostProcessorApplicationPreparedEvent判断环境中是否存在VCAP_APPLICATION或者VCAP_SERVICES。如果有就添加Cloud Foundry的配置;没有就不执行任何操作。
FileEncodingApplicationListenerApplicationEnvironmentPreparedEvent文件编码的监听器
AnsiOutputApplicationListenerApplicationEnvironmentPreparedEvent根据 spring.output.ansi.enabled参数配置 AnsiOutput
ConfigFileApplicationListenerApplicationEnvironmentPreparedEvent <br>ApplicationPreparedEvent完成相关属性文件的加载,application.properties
application.yml
前面源码内容详细讲解过
DelegatingApplicationListenerApplicationEnvironmentPreparedEvent监听到事件后转发给环境变量 context.listener.classes指定的那些事件监听器
ClasspathLoggingApplicationListenerApplicationEnvironmentPreparedEvent <br>ApplicationFailedEvent一个SmartApplicationListener,对环境就绪事件ApplicationEnvironmentPreparedEvent/应用失败事件ApplicationFailedEvent做出响应,往日志DEBUG级别输出TCCL(thread context class loader)的classpath。
LoggingApplicationListenerApplicationStartingEvent <br>ApplicationEnvironmentPreparedEvent <br>ApplicationPreparedEvent <br>ContextClosedEvent <br>ApplicationFailedEvent配置 LoggingSystem。使用 logging.config环境变量指定的配置或者缺省配置
LiquibaseServiceLocatorApplicationListenerApplicationStartingEvent使用一个可以和Spring Boot可执行jar包配合工作的版本替换liquibase ServiceLocator
BackgroundPreinitializerApplicationStartingEvent <br>ApplicationReadyEvent <br>ApplicationFailedEvent尽早触发一些耗时的初始化任务,使用一个后台线程

4.2 SpringBoot中默认的事件

SpringBoot中的所有的事件都是继承于 ApplicationEvent这个抽象类,在SpringBoot启动的时候会发布如下的相关事件,而这些事件其实都实现了 SpringApplicationContext接口。

事件说明
ApplicationStartingEvent容器启动的事件
ApplicationEnvironmentPreparedEvent应用处理环境变量相关的事件
ApplicationContextInitializedEvent容器初始化的事件
ApplicationPreparedEvent应用准备的事件
ApplicationFailedEvent应用启动出错的事件
ApplicationStartedEvent应用Started状态事件
ApplicationReadyEvent应用准备就绪的事件

这些事件都是属于SpringBoot启动过程中涉及到的相关的事件

好了,本篇文章【详细学习SpringBoot核心源码之监听器原理-5(观察者设计模式、初始化并加载监听器核心流程、事件的发布器核心流程、SpringBoot中默认的监听器以及默认的事件类型)】到学习到这里,下篇文章我们将先来学习一下自定义监听器的实现过程,然后再来学习配置文件的核心流程。

钉钉Java面经及参考答案 TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自 阅读详情

相关推荐

Unity采样器过多导致URP默认的Lit.Shader报错(shader error in ‘universal render pipeline/lit’: maximum ps_4_0 samp)

Shader中多个Sample Texture2D,Sample Texture3D或者类似节点的使用,该类节点都需要一个采样器,如果Shader使用超过了16个纹理采样器,如多个Base Color,Normal Map等,就容易超出。是因为每种Shader Model和GPU都有一个对纹理采样器数量的限制,是因为每个采样器都需要在显卡占用一个独立的寄存器,而寄存器的数量是有限的,当超过限制,显卡无法分配更多的寄存器给新的采样器,因此会导致编译错误。2.什么原因导致纹理采样器超出16个?

qq_41884036的博客 4233

spring源码解读系列(八):观察者模式--spring监听器详解

一、前言 在前面的文章中spring源码解读系列(八)中,我们继续剖析了spring的核心refresh()方法中的registerBeanPostProcessors(beanFactory)(完成BeanPostProcessor的注册)和initMessageSource()(为上下文初始化message源,即不同语言的消息体,国际化处理),有心的朋友顺着我们的思路继续看,发现下面开始了initApplicationEventMulticaster()(初始化事件监听多路广播器),那么什么又是多路广播

wwwvipp的博客 1万+

AI赋能软件测试:从冒烟测试到全流程智能化的效率革命

软件测试是确保软件质量的关键环节,其核心原理是通过预设用例验证系统功能是否符合预期。传统测试方法依赖人工编写和维护脚本,面临维护成本高、适应性差等挑战。随着人工智能技术的发展,特别是自然语言处理和计算机视觉的成熟,AI为测试领域带来了新的技术价值。通过让AI理解应用界面和业务逻辑,可以实现测试用例的智能生成、自主执行和结果分析,显著提升测试效率和覆盖率。在实际应用场景中,AI驱动的冒烟测试能够动态适应UI变化,自动分析失败日志,将测试人员从重复劳动中解放出来,专注于更复杂的质量策略设计。本文基于AI在冒烟测

weixin_28841265的博客 306

Spring事件监听机制

Spring 的事件监听机制,采用了观察者的设计模式。一套完整的事件监听流程是这样的,首先定义事件类,即ApplicationEvent的子类,它包含事件发生的时间戳timestamp和产生事件的来源source,以及自定义的其它事件属性;然后实现事件监听器 ApplicationListener 并注册到容器,订阅感兴趣的事件,Spring 会在事件发生时触发监听器;最后通过事件发布器 ApplicationEventPublisher 发布自定义事件。

程序员小潘 1678

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6217

JY02无刷电机驱动芯片的硬件设计与调试实战

本文详细介绍了JY02无刷电机驱动芯片的硬件设计与调试实战。重点解析了其外置MOSFET的设计优势,提供了从电源滤波、功率MOSFET选型到电流采样保护的核心电路设计指南。文章还分享了安全上电、动态测试及常见问题排查的完整调试流程,并探讨了开关优化、闭环测速等性能提升技巧,帮助开发者构建稳定高效的无刷电机驱动系统。

weixin_29193359的博客 363

Spring - 事件监听机制 源码解析

事件事件生产者事件消费者控制器 (管理生产者、消费者和事件之间的注册监听关系)在Spring中,事件监听机制主要实现是通过事件、事件监听器、事件发布者和事件广播器来实现。

小工匠 3万+

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1896

springboot进行事件监听有四种方式

springboot进行事件监听有四种方式: 1.手工向ApplicationContext中添加监听器 2.将监听器装载入spring容器 3.在application.properties中配置监听器 4.通过@EventListener注解实现事件监听 讲到事件监听,这里我们说下自定义事件和自定义监听器类的实现方式: 自定义事件:继承自ApplicationEvent抽象类,然后定义自己的构...

qianxiaopeng的专栏 2453

不藏了!Wireshark 命令、捕获、过滤器大全分享给你

Wireshark,这款广受欢迎的开源网络协议分析工具,堪称网络管理员、网络安全专家和网络爱好者的“显微镜”!它可以帮助我们捕获网络中的数据包,并提供详细的解码和分析能力。本文将为您全面剖析 Wireshark 的强大功能,从基础到高级,让你快速掌握这个神器!💡Wireshark 是一款功能强大的网络协议分析器,最早由 Gerald Combs 于 1998 年开发,经过多年发展,已成为网络诊断和分析的首选工具。

网络技术联盟站 725

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2852

设计模式-观察者模式 (在spring下的使用)

1. 简介 :观察者模式()也被称为发布订阅模式(它的定义是这样的在对象之间定义⼀个⼀对多的依赖,当⼀个对象状态改变的时候,所有依赖的对象都会⾃动收到。⼀般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer不过,在实际的项⽬开发中,这两种对象的称呼是⽐较灵活的,有各种不同的叫法,⽐如:Subject-Observer不管怎么称呼,只要应⽤场景符合刚刚给出的定义,都可以看作观察者模式。

来都来了 1089

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【详细学习SpringBoot源码之属性配置文件加载原理(application.properties|application.yaml)-7】

【详细学习SpringBoot源码之属性配置文件加载原理】在创建SpringBoot项目的时候会在对应的application.properties或者application.yml文件中添加对应的属性信息,我们的问题是这些属性文件是什么时候被加载的?结合我们前面介绍的SpringBoot中的监听事件机制,我们首先看下SpringApplication.run()方法,在该方法中会针对SpringBoot项目启动的不同的阶段来发布对应的事件。如果自定义了就加载自定义的。

Coder_ljw的博客 2151

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【详细学习SpringBoot源码之属性配置文件加载原理(Bootstrap.properties|Bootstrap.yml)-8】

上篇文章我们学习了SpringBoot中application.properties配置文件以及application.yml配置文件的加载原理,接下来我们就来学习关于boorstrap.properties配置文件的加载原理。通过访问看到bootstrap.properties中的信息获取到了,同时age也被application.properties中的属性覆盖掉了。搞清楚了监听器的关系后,我们来看下启动的流程代码具体是怎么执行的。当启动的时候发布对应的事件,该监听器会触发相关的解析行为。

Coder_ljw的博客 1997

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】

【详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】上一篇文章我们详细的学习了SpringBoot中的监听器机制,清楚的知道了SpringBoot中默认给我们提供了多个监听器,提供了一个默认的事件发布器,还有很多默认的事件,接下里我们就在前面的基础上来自定义实现一个监听器。如果我们想要通过自定义的监听器来监听自定义的事件呢?我们就需要在之前自定义监听器的基础上,再创建自定义的事件类,只需要继承ApplicationEvent。

Coder_ljw的博客 757

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】

【详细学习SpringBoot源码之内嵌Tomcat启动原理分析&编译部署Tomcat源码过程解析-9】。有了上面的自动配置类的支持我们就可以看看在SpringBoot的run方法中是在哪个位置帮我们内嵌了Tomcat容器呢?上面的报错解决方式,可以在org.apache.catalina.startup包下ContextConfig类中的configureStart方法中,添加一下JSP解析器初始化即可。这块的内容非常重要,是我们后面串联的时候的一个切入点。

Coder_ljw的博客 698

夯实Spring系列|第二十二章:Spring 事件(Events)

夯实Spring系列|第二十二章:Spring 事件(Events) 文章目录夯实Spring系列|第二十二章:Spring 事件(Events)前言1.项目环境2.Java 事件/监听编程模型3.面向接口的事件/监听器设计模式4.面向注解的事件/监听器设计模式5.Spring 标准事件-ApplicationEvent6.基于接口的 Spring 事件监听器7.基于注解的 Spring 事件监听器8.注册 Spring ApplicationListener9.Spring 事件发布器10.Spring

谢文峰的博客 669

【详细学习SpringBoot源码-SpringBoot中的Actuator应用-数据可视化操作之SpringBootAdmin-数据可视化操作之Prometheus+Grafana安装部署-10】

【详细学习SpringBoot源码-SpringBoot中的Actuator应用-数据可视化操作之SpringBootAdmin-数据可视化操作之Prometheus+Grafana安装部署-10】执行器端点(endpoints)可用于监控应用及与应用进行交互,Spring Boot包含很多内置的端点。每个端点都可以启用或禁用。这控制着端点是否被创建,并且它的bean是否存在于应用程序上下文中。还必须通过JMX或HTTP进行暴露,大部分应用选择HTTP,端点的ID映射到一个带/actuator前缀的URL。

Coder_ljw的博客 1174

Spring 事件发布监听源码解析

默认情况下容器不会为用户创建执行器实例,因而对监听器的回调是同步进行的,即所有监听器的监听方法都在推送事件的线程中被执行,通常这也是处理业务逻辑的线程,若其中一个监听器回调执行阻塞,则会阻塞整个业务处理的线程,造成严重的后果。Spring 事件监听机制离不开容器 IOC 特性提供的支持,比如容器会自动创建事件发布器,自动识别用户注册的监听器并进行管理,在特定的事件发布后会找到对应的事件监听器并对其监听方法进行回调。它如何根据发布的事件找到对应的事件监听器,事件和由该事件触发的监听器之间的匹配规则是怎样的。

wouderw的博客 276

SpringEvent 事件发布/监听机制相关源码解析

该篇文章是我学习SpringEvent源码实现的过程,看源码的过程中,会涉及到程序启动时系统监听类的注入、自定义监听类的注入、事件发布后如何通知监听类等等,如果一一记录,就显得又长又混乱了,所以本篇只涉及事件发布后如何通知监听类的源码,其他的只会稍微提一提。关于SpringEvent的介绍和应用可以看我之前写的文章SpringEvent介绍与应用。...

MDZZ666的博客 604

【SpringBoot】SpringBoot中使用监听器(Listener)

前言     监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作;主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域     在目前的Servlet API中提供的web事件监听器接口有如下所示的几个: 1.ServletContextListener -- 监听servletContext对象的创建以及销毁 1.1 contextInitialized(ServletConte

qgnczmnmn的博客 8627

Springboot事件监听机制:工作原理

这是继《springboot事件监听机制一:实战应用》第二篇,知其然,当然还要知其所以然,深入的源码里面探寻一下这一有套机制的工作原理。spring生态很茂盛,这里不会站太高去分析这个问题,大扯spring的一些原理,而是以一个求知者的心态去探索spring监听机制的秘密,可能我分析得并不透彻,但我想如果能给看到这篇文章的你带去一些灵感或者触动也是好的。罗马不是一天就能建立起来的,想要弄懂它也非一天的事,多想多看总会明白的。另外看源码的时候,一定是带着问题去探寻,时刻把握好问题的核心,切忌被旁枝末节打扰而迷

凡夫编程 2575

Spring Boot 事件监听机制工作原理

总结:Spring Boot 事件监听机制工作原理其实和 Spring 的事件监听机制原理一样,Spring Boot 只是通过自动配置简化了一些复杂的配置而已,如果我们熟读 Spring 的源码,那对 Spring Boot 的源码解读是有极大帮助的,Spring Boot 很多功能都是基于 Spring 的,最后本篇关于 Spring Boot 事件监听机制工作原理的分享,希望可以帮助到需要的小伙伴。事件监听器需要注册到事件发布器中,那事件监听器是设么时候注册的?如有不正确的地方请各位指出纠正。

weixin_42118323的博客 2056

SpringBoot监听器原理解析

SpringBoot广播器一、监听器模式要素二、系统时间介绍三、监听器的注册四、实现自定义监听器五、注意点 一、监听器模式要素 二、系统时间介绍 三、监听器的注册 四、实现自定义监听器 五、注意点 ...

摩羯座de杰杰陆的博客 637

5、springboot原理分析-监听机制

一、java监听机制 springboot的监听机制,其实就是对java提供监听机制的封装。 为此我们可以先了解一下java的监听机制: Java中的事件监听机制定义了以下几个角色: 事件(Event):要求所有的event继承 java.util.EventObject 类的对象 事件源(Source):可以监听任意对象Object、属性的创建和销毁,等 一些生命周期的变化情况。 监听器(Listener):要求所有的监听器实现 java.util.EventListener 接口的对象 二、Spri

程金鹏(程利鹏) 1181
上一篇: 【RocketMQ的高可用原理机制、RocketMQ的集群部署方式、数据刷盘机制中的同步刷盘和异步刷盘、主从同步机制和主从异步机制、broker文件中的相关配置信息以及代表的含义】
下一篇: 【详细学习SpringBoot源码之自定义监听器实战演练-6(自定义监听器、自定义监听事件、指定监听事件)】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

硕风和炜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值