spring中常用工具类介绍

Spring 框架中的常用工具类及其应用 Spring 提供了许多实用的工具类,涵盖了字符串操作、集合操作、对象操作、反射操作、Bean 操作、资源处理、路径匹配、性能测量、邮件发送和 JSON 操作等方面。以下是一些常用的工具类及其功能概述。通过本文的介绍,我们了解了 Spring 框架中一些常用的工具类及其应用场景。合理使用这些工具类可以显著提高开发效率和代码质量。希望这些信息对你有所帮助! 阅读详情

spring中常用工具类介绍

文件资源操作
Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口是为了统一各种类型不同的资源而定义的,Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名、URL 地址以及资源内容的操作方法

访问文件资源
* 通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
* 通过 ClassPathResource 以类路径的方式进行访问;
* 通过 ServletContextResource 以相对于 Web 应用根目录的方式进行访问。 
package com.baobaotao.io; 
import java.io.IOException; 
import java.io.InputStream; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.FileSystemResource; 
import org.springframework.core.io.Resource; 
public class FileSourceExample { 
public static void main(String[] args) { 
try { 
String filePath = 
"D:/masterSpring/chapter23/webapp/WEB-INF/classes/conf/file1.txt"; 
// ① 使用系统文件路径方式加载文件
Resource res1 = new FileSystemResource(filePath); 
// ② 使用类路径方式加载文件
Resource res2 = new ClassPathResource("conf/file1.txt"); 
InputStream ins1 = res1.getInputStream(); 
InputStream ins2 = res2.getInputStream(); 
System.out.println("res1:"+res1.getFilename()); 
System.out.println("res2:"+res2.getFilename()); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
} 
在获取资源后,您就可以通过 Resource 接口定义的多个方法访问文件的数据和其它的信息
getFileName() 获取文件名,
getFile() 获取资源对应的 File 对象,
getInputStream() 直接获取文件的输入流。
createRelative(String relativePath) 在资源相对地址上创建新的资源。

在 Web 应用中,您还可以通过 ServletContextResource 以相对于 Web 应用根目录的方式访问文件资源
Spring 提供了一个 ResourceUtils 工具类,它支持“classpath:”和“file:”的地址前缀 ,它能够从指定的地址加载文件资源。
File clsFile = ResourceUtils.getFile("classpath:conf/file1.txt"); 
System.out.println(clsFile.isFile()); 
String httpFilePath = "file:D:/masterSpring/chapter23/src/conf/file1.txt"; 
File httpFile = ResourceUtils.getFile(httpFilePath); 

文件操作
在使用各种 Resource 接口的实现类加载文件资源后,经常需要对文件资源进行读取、拷贝、转存等不同类型的操作。


FileCopyUtils
它提供了许多一步式的静态操作方法,能够将文件内容拷贝到一个目标 byte[]、String 甚至一个输出流或输出文件中。
package com.baobaotao.io; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileReader; 
import java.io.OutputStream; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 
import org.springframework.util.FileCopyUtils; 
public class FileCopyUtilsExample { 
public static void main(String[] args) throws Throwable { 
Resource res = new ClassPathResource("conf/file1.txt"); 
// ① 将文件内容拷贝到一个 byte[] 中
byte[] fileData = FileCopyUtils.copyToByteArray(res.getFile()); 
// ② 将文件内容拷贝到一个 String 中
String fileStr = FileCopyUtils.copyToString(new FileReader(res.getFile())); 
// ③ 将文件内容拷贝到另一个目标文件
FileCopyUtils.copy(res.getFile(), 
new File(res.getFile().getParent()+ "/file2.txt")); 
// ④ 将文件内容拷贝到一个输出流中
OutputStream os = new ByteArrayOutputStream(); 
FileCopyUtils.copy(res.getInputStream(), os); 
} 
} 
static void copy(byte[] in, File out) 将 byte[] 拷贝到一个文件中
static void copy(byte[] in, OutputStream out) 将 byte[] 拷贝到一个输出流中
static int copy(File in, File out) 将文件拷贝到另一个文件中
static int copy(InputStream in, OutputStream out) 将输入流拷贝到输出流中
static int copy(Reader in, Writer out) 将 Reader 读取的内容拷贝到 Writer 指向目标输出中
static void copy(String in, Writer out) 将字符串拷贝到一个 Writer 指向的目标中

属性文件操作
Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件 地址加载属性资源
package com.baobaotao.io; 
import java.util.Properties; 
import org.springframework.core.io.support.PropertiesLoaderUtils; 
public class PropertiesLoaderUtilsExample { 
public static void main(String[] args) throws Throwable { 
// ① jdbc.properties 是位于类路径下的文件 
Properties props = PropertiesLoaderUtils.loadAllProperties("jdbc.properties"); 
System.out.println(props.getProperty("jdbc.driverClassName")); 
} 
} 

特殊编码的资源
当您使用 Resource 实现类加载文件资源时,它默认采用操作系统的编码格式。如果文件资源采用了特殊的编码格式(如 UTF-8),则在读取资源内容时必须事先通过 EncodedResource 指定编码格式,否则将会产生中文乱码的问题。
package com.baobaotao.io; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.core.io.Resource; 
import org.springframework.core.io.support.EncodedResource; 
import org.springframework.util.FileCopyUtils; 
public class EncodedResourceExample { 
public static void main(String[] args) throws Throwable { 
Resource res = new ClassPathResource("conf/file1.txt"); 
// ① 指定文件资源对应的编码格式(UTF-8)
EncodedResource encRes = new EncodedResource(res,"UTF-8"); 
// ② 这样才能正确读取文件的内容,而不会出现乱码
String content = FileCopyUtils.copyToString(encRes.getReader()); 
System.out.println(content); 
} 
} 


访问 Spring 容器,获取容器中的 Bean,使用 WebApplicationContextUtils 工具类 
ServletContext servletContext = request.getSession().getServletContext();
WebApplicationContext wac = WebApplicationContextUtils. getWebApplicationContext(servletContext); 


Spring 所提供的过滤器和监听器

延迟加载过滤器
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。
Spring 为此专门提供了一个 OpenSessionInViewFilter 过滤器,它的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。
<filter> 
<filter-name>hibernateFilter</filter-name> 
<filter-class> 
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 
</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>hibernateFilter</filter-name> 
<url-pattern>*.html</url-pattern> 
</filter-mapping> 

中文乱码过滤器
<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class> 
org.springframework.web.filter.CharacterEncodingFilter ① Spring 编辑过滤器
</filter-class> 
<init-param> ② 编码方式
<param-name>encoding</param-name> 
<param-value>UTF-8</param-value> 
</init-param> 
<init-param> ③ 强制进行编码转换
<param-name>forceEncoding</param-name> 
<param-value>true</param-value> 
</init-param> 
</filter> 
<filter-mapping> ② 过滤器的匹配 URL 
<filter-name>encodingFilter</filter-name> 
<url-pattern>*.html</url-pattern> 
</filter-mapping> 


一般情况下,您必须将 Log4J 日志配置文件以 log4j.properties 为文件名并保存在类路径下。Log4jConfigListener 允许您通过 log4jConfigLocation Servlet 上下文参数显式指定 Log4J 配置文件的地址,如下所示:
① 指定 Log4J 配置文件的地址
<context-param> 
<param-name>log4jConfigLocation</param-name> 
<param-value>/WEB-INF/log4j.properties</param-value> 
</context-param> 
② 使用该监听器初始化 Log4J 日志引擎
<listener> 
<listener-class> 
org.springframework.web.util.Log4jConfigListener 
</listener-class> 
</listener> 


Introspector 缓存清除监听器,防止内存泄露
<listener> 
<listener-class> 
org.springframework.web.util.IntrospectorCleanupListener 
</listener-class> 
</listener> 


一些 Web 应用服务器(如 Tomcat)不会为不同的 Web 应用使用独立的系统参数,也就是说,应用服务器上所有的 Web 应用都共享同一个系统参数对象。这时,您必须通过 webAppRootKey 上下文参数为不同 Web 应用指定不同的属性名:如第一个 Web 应用使用 webapp1.root 而第二个 Web 应用使用 webapp2.root 等,这样才不会发生后者覆盖前者的问题。此外,WebAppRootListener 和 Log4jConfigListener 都只能应用在 Web 应用部署后 WAR 文件会解包的 Web 应用服务器上。一些 Web 应用服务器不会将 Web 应用的 WAR 文件解包,整个 Web 应用以一个 WAR 包的方式存在(如 Weblogic),此时因为无法指定对应文件系统的 Web 应用根目录,使用这两个监听器将会发生问题。

 

特殊字符转义
Web 开发者最常面对需要转义的特殊字符类型:
* HTML 特殊字符;
* JavaScript 特殊字符;

 

HTML 特殊字符转义
* & :&amp;
* " :&quot;
* < :&lt;
* > :&gt;

 

JavaScript 特殊字符转义
* ' :/'
* " :/"
* / ://
* 走纸换页: /f
* 换行:/n
* 换栏符:/t
* 回车:/r
* 回退符:/b

 

工具类

JavaScriptUtils.javaScriptEscape(String str);

HtmlUtils.htmlEscape(String str);①转换为HTML转义字符表示

HtmlUtils.htmlEscapeDecimal(String str); ②转换为数据转义表示

HtmlUtils.htmlEscapeHex(String str); ③转换为十六进制数据转义表示

HtmlUtils.htmlUnescape(String str);将经过转义内容还原

 

Spring框架下自带了丰富的工具类,在我们开发时可以简化很多工作:
1.Resource访问文件资源:
具体有:ResourceUtils.getFile(url);
FileSystemResource(); ClassPathResource();
ServletContextResource(application,url);


2.文件操作 FileCopyUtils
具体有:FileCopyUtils.copy(Resource.getFile,new File(Resource.getFile(),getParent()+'目标文件名'));


3.属性文件操作 PropertiesLoaderUtils 
具体有: PropertiesLoaderUtils.loadAllProperties("属性文件名"); --基于类路径


4.EncodedResource(Resource对象,"UTF-8") 编码资源(特殊的);


5.WebApplicationContextUtils


6.StringEscapeutils 编码解码


计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测 计算机视觉是一门研究如何使机器从数字图像或视频中提取、分析和理解有用信息的学科。它涉及图像处理、计算机图形学、人工智能等多个领域的知识。通过计算机视觉技术,我们可以实现图像的识别、分类、目标检测等功能。本文介绍了计算机视觉与深度学习的基本概念和原理,并以Python为工具,基于帧间差分法实现了视频目标检测。帧间差分法具有算法实现简单、程序设计复杂度低、对光线等场景变化不太敏感等优点,因此在实际应用中得到了广泛的应用。然而,帧间差分法也存在一些局限性,如对于缓慢移动或静止的物体检测效果不佳。 阅读详情

相关推荐

散户逆袭神器:用通达信DIY指数发现下一个光伏储能(附龙头股筛选模板)

本文详细介绍了如何利用通达信软件的自定义指数功能,构建个人专属的行业监控工具,以发现类似光伏储能这样的潜力赛道。文章提供了从零开始的指数编制步骤、核心的龙头股筛选模板,以及五个关键的数据校验技巧,帮助散户投资者实现机构级的行业分析与机会挖掘,有效提升投资决策能力。

w3x4y的博客 483

Spring常用工具类

文章目录一、内置工具类1、断言2、对象、数组、集合2.1 ObjectUtils2.2 StringUtils2.3 CollectionUtils3、文件、资源、IO 流3.1 FileCopyUtils3.2 ResourceUtils3.3 StreamUtils4、反射、AOP4.1 ReflectionUtils4.2 AopUtils4.3 AopContext4.4 AOP举例二、第三方工具类 一、内置工具类 内置工具类一般位于org.springframework.util下 1、断言 断

Shawn的个人博客 5297

HFSS仿真中如何提取最大E/H场强与频率关系曲线

本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。

ss78901的博客 1099

别瞎写工具类了,Spring自带的不香吗?

有时候,我们需要在项目中使用反射功能,如果使用最原始的方法来开发,代码量会非常多,而且很麻烦,它需要处理一大堆异常以及访问权限等问题。很多时候,我们会在代码中定义http的返回码,比如:接口正常返回200,异常返回500,接口找不到返回404,接口不可用返回502等。在我们日常开发过程中,对字符串的操作是非常频繁的,但JDK提供的对于字符串操作的方法,过于简单,无法满足我们开发中的需求。对于后端的很多接口,经常需要去掉前后空格,我们可以使用String类的trim(),但是如果要同时去掉中间的空格呢?

weixin_JimZemlin的博客 1431

新手避坑指南:在MacBook上为PyTorch正确配置MPS环境,跑通第一个YOLOv8训练

本文详细指导新手如何在MacBook上为PyTorch正确配置MPS环境,并成功运行YOLOv8训练。从环境准备、PyTorch安装到YOLOv8配置和性能调优,提供全面的避坑指南和实用技巧,帮助开发者充分利用Mac的GPU加速能力。

weixin_29100399的博客 228

AIGC算法工程师面试八股文深度解析与进阶指南:揭秘Diffusion Models核心原理与实战技巧

总结来说,Cosine Noise Scheduler 的核心优势在于它能够更巧妙地平衡信号和噪声的比例,在扩散过程的早期阶段更长时间地保留原始图像的细节信息,从而为去噪模型提供一个更友好的学习环境,最终带来更优异的生成质量。🚀

FJN110的博客 346

干货分享:Spring中经常使用的工具类(提示开发效率)

干货分享:Spring中经常使用的工具类(提示开发效率)资源工具类、对象工具类、数组转换、Stream流操作、系统属性解析、集合工具类、AOP代理工具BeanFactory工具类、注解工具类、Bean工具类、数据验证工具类、XML解析工具类、HTML转换工具类,WEB相关工具类

三两肉的博客 1609

Cesium 入门

Viewer:主要窗口Cesium 展示三维要素内容的主要窗口,包含三维地球的视窗,还包含了一些基础控价const viewer = new Cesium.Viewer('div的ID',{ options可选参数 },包括图层)options可选参数animation: false, 隐藏动画效果timeline:false, 隐藏时间轴等等Scene:场景类,隐藏地球图层Entity:实体类。

虎康的博客 3667

Spring的工具类

下面是Spring中的一些常用工具类:StringUtils:提供了许多字符串操作方法,如字符串拼接、替换、截取等等。 ArrayUtils:提供了一系列有用的数组操作方法,如数组合并、查找、排序等等。 CollectionUtils:提供了一系列有用的集合操作方法,如集合合并、查找、排序等等。 BeanUtils:提供了一个实用的工具类,用于JavaBean之间的复制和属性的赋值。 ClassPathResource:提供了一个方便的方法,用于在类路径中查找资源文件。 ApplicationContext

qq_50523945的博客 470

YOLO11训练中的批量大小(Batch Size)选择策略:分析Batch Size对训练速度、显存占用和模型性能的影响

在深度学习训练过程中,Batch Size(批量大小)是一个至关重要的超参数,它指的是单次迭代中用于更新模型权重的样本数量。简单来说,当我们训练神经网络时,不会一次性将所有数据喂给模型,而是将数据分成若干个小批次(batch),每个批次包含一定数量的样本,这个数量就是Batch Size。 Batch Size的核心作用在于平衡训练效率与模型性能。较小的Batch Size意味着每次更新权重时参考的信息较少,可能导致训练过程更加随机,但有时能带来更好的泛化能力;较大的Batch Size则能提供更稳定的梯

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 323

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】

本次实践作业将在以下环境进行: 该环境由一个 6×6 网格组成,其中黄色圆圈为智能体出发点,黑色格子为无法通过的墙壁,若智能体向着墙壁方向移动,则会停留在原地,地图边界的移动同理。带有黄色边框的格子为终止状态,即若智能体行动至此状态则整个 episode 结束。红色和绿色表示当前该状态的奖励值,奖励越高则绿色越深,奖励越低则红色越深。状态空间:36(0-35 这 36 个整数,左下角为 0,向右 +1,向上 +6)动作空间:4(0-3 这 4 个整数分别代表左、右、上、下)奖励函数:普通格子 -0.1,到

zik的博客 1398

Spring之工具类

Spring之工具类 日常学习开发中,项目中经常需要用到各种工具类,而Spring框架中为我们提供了一些列工具,我们可以在不引用其他包的情况下,使用这些工具也能满足常规需求。 断言工具Assert public static void testAssert() { // false将会抛出IllegalStateException异常 Assert.state(false, "状态异常"); // 自定义消息时,传递一个Supplier函数式接口 Assert.state(f

kenewstar的博客 7136

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7170

spring管理的类如何调用非spring管理的类

spring管理的类如何调用非spring管理的类.   就是使用一个spring提供的感知概念,在容器启动的时候,注入上下文即可.   下面是一个工具类. 1 import org.springframework.beans.BeansException; 2 import org.springframework.context.ApplicationContext; ...

weixin_30312659的博客 472

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring类

动态数据源配置需要继承 AbstractRoutingDataSource 实现 determineCurrentLookupKey 方法。@Override。

qq_42219004的博客 780

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

未被spring托管的类引用被spring托管的类

在spring的开发中,我们通常都是将类或者接口注入到spring中进行托管,这样做很明显的好处就是避免了实例化。 但是如果我们在一个没有被spring托管的类中引用一个被spring托管的类时,我们会发现使用@Resource或者@Autowired注解都是没有用的,这时候应该怎么办呢,我在最近的工作中就遇到了这个问题,可能是因为本人对spring理解不透彻的问题,所以这个问题就很困扰我,然而旁边的程序员很轻松的就帮我解决了。talk is cheap,show me your code! 代码就是这样

Waiter_s的博客 1328

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring 中将service 注入到普通的类中

在spring管理的web项目里,譬如Struts和spring的项目,配置好后,Struts里就可以直接使用定义好的service。但是如果要在普通的工具类里,使用service或dao,就会报空指针,因为这个普通的Java类并不在spring管理下,不能使用spring注入的service。 方法一:(亲测可用,直接在方法上注入) 方法二:(测试不可用) 最后,记得在applic...

weixin_40805079的博客 1177

spring 主要涉及类类图

把spring 相关类做了下整理,把spring主要涉及的类都整理成类图,方便查看它们之前的关系,也能帮助更好的阅读分析源码. 1. IOC容器 BeanFactory类图: 2.  资源Resource相关类图: 3. 资源加载器ResourceLoader相关类图: 4. spring Bean定义解析器相关: 5. 实

strivezxq的专栏 1万+

spring获取指定包下面的所有类

import java.io.IOException; import java.util.HashSet; import java.util.Set; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.spr...

weixin_34185364的博客 3336

关于web项目中非spring管理的类调用spring控制的类的问题

今天项目中用到了非spring管理的类调用spring管理的类,搞了将近一天都是空指针错误真不知道是怎么搞的。最终仔细分析了下我的需求是从串口中读数放入数据库但是另外几个类都是由spring接管的持久层用的ibatis而我在串口中的那个类无论如何都是调用不了这几个类。 在网上找了很多也不尽人意,最终还是回到了最原始最简单的办法。方法如下: String[] str = {"这个里面写你...

ioipuyt的专栏 408

Spring框架下类的初始化顺序

Spring框架下类的初始化顺序

hgffhh的博客 1419

Spring 常用工具类

import com.google.common.collect.Lists; import org.springframework.util.*; import java.io.Serializable; import java.lang.reflect.Method; import java.util.List; class BeanDO implements Serializable {...

gaofla的博客 110

Spring类注解的使用

首先我们得明确一点,为什么需要使用注解,这是为了更加简单的读取和存储对象.而类注解则是其中一种,本篇文章的目的就是为大家介绍怎么使用类注解和介绍类注解的基本内容.本篇文章注解介绍的是类注解有哪些以及类注解的使用.首先我们得配置好扫描路径,之后再对其使用,其次还有一个需要理解的是,五大类注解的分层.

ta_older的博客 293

Spring使用Configuration类进行配置

通过使用@Configuration标签来标记配置类,也就是说我们现在不再需要创建某个xml文件作为配置文件,而是使用某个类,并且引入@Configuration标签来进行创建配置类。2.在确定好了配置类之后,我们还需要解决如何扫描标签的这个问题,在xml文件中使用context:component-scan>标签来进行扫描,而在配置类中只需要使用@CompoentScan(classpath:标签对应的上级包的路径)。对于这样的类,我们可以在配置类中构建单独的方法,来对这个封装类进行相应构建。

Hellyc的博客 780

Spring获取所有被托管的类

 有的时候想获取被Spring托管的类,并且想对其进行修改。  步骤: 创建一个类实现ApplicationContextAware接口,加上注解@Component 。重写setApplicationContext(ApplicationContext applicationContext)方法,在此方法中可以获取ApplicationContext对象  示例: @Component public class GetTest implements ApplicationContextAware {

tanxinji的博客 584

Java中Spring框架中常用工具类的简介说明

Spring框架中常用工具类说明

qq_25073223的博客 178
上一篇: org.apache.log4j.Logger 详解
下一篇: eclipse中如何对jar包关联的源代码进行调试?
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值