【Spring框架】Spring的AOP使用

Spring框架中AOP应用的入门案例 面向切面编程(AOP)是软件开发中的一种编程范式,它通过分离横切关注点(cross-cutting concerns)来增加模块化。在Spring框架中,AOP被广泛应用于事务管理、安全检查、日志记录和缓存等方面。它允许开发者定义方法执行前后以及抛出异常时需要执行的代码(通知),而不需要修改原有业务逻辑。Spring AOP利用动态代理机制来实现AOP,支持方法级别的拦截。接下来,本文将深入探讨AOP的核心概念,包括切面、通知、连接点、织入等,并比较Spring AOP与其他AOP实现的不同之处。 阅读详情

Spring的AOP使用

我们在Spring框架中实现AOP功能主要是通过AspectJ实现的,AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。需要注意的是,AspectJ并不是Spring框架的一部分,它只是用于和Spring结合在一起共同完成有关AOP的操作而已。

AOP结合AspectJ的使用主要有两种方式:

  • 基于XML配置的方式实现;
  • 基于注解的方式实现;
基于XML配置的方式实现
1、引入AOP需要的相关jar包

在Spring框架的基本jar包的基础上,我们还需要引入AOP相关的jar包。

<!--AOP相关jar包-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.1.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.0</version>
</dependency>

<dependency>
    <groupId>aopalliance</groupId>
    <artifactId>aopalliance</artifactId>
    <version>1.0</version>
</dependency>
2、配置XML文件

在基础约束的基础上还需要导入AOP的相关约束条件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>
3、通过相关实例进行AOP的使用

场景:在基础业务逻辑上增加某个功能的实现。例如,在书本相关操作的基础上添加日志操作。

  • 实现类:
//基础类
public class Book {
    //方法1:写方法
    public void  writeBook() {
        //业务逻辑
        System.out.println("writeBook");
    }

    //读方法
    public void  readBook() {
        //业务逻辑
        System.out.println("readBook");
    }
}
  • 增强类:
/**
 * 增强类
 * 完成添加日志
 */
public class DiyLog {
    public void log() {
        //业务逻辑
        System.out.println("打印日志");
    }
}
4、使用表达式来配置切入点
  • execution函数介绍:在通知中定义切入点,通过execution函数,可以定义切入点的方法切入。
  • 切入点:实际增强的方法。
  • 常用的表达式:
    • execution(<访问限定符>?<返回类型><方法名>(<参数>)<异常>)
    • execution(* com.test.bean.Book.writeBook(..)) ,表示类Book里面的writeBook的方法。
    • execution(* com.test.bean.Book.*(..)),表示类Book下的所有的方法。
    • execution(* *.*(..)),表示所有的。
  • 例如:
    • 匹配所有的public方法:execution(public *.*(..))
    • 匹配指定包路径下所有类的方法:execution(* com.test.bean.*(..)) (不包含子包)
    • 匹配指定包路径下所有类的方法:execution(* com.test.bean..*(..))(包含包,子包的所有类)
    • 匹配指定类的所有方法:execution(* com.test.bean.Book.*(..))
    • 匹配特定开头的方法:execution(* com*(..))
5、配置切入点
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!--将基本对象交给spring管理-->
    <bean id="book" class="com.test.bean.Book"/>
    <bean id="diyLog" class="com.test.bean.DiyLog"/>

    <!--配置AOP操作-->
    <aop:config>
        <!--配置切入点:使用表达式,在实际的方法上添加通知的方法称之为切入点-->
        <aop:pointcut id="pointcut1" expression="execution(* com.test.bean.Book.writeBook(..))"/>

        <!--配置切面:把增强用到方法-->
        <aop:aspect ref="diyLog">
            <!--配置增强类型   method:增强类中的那个方法作为前置增强-->
            <aop:before method="log" pointcut-ref="pointcut1"/>
            <!--
                aop:before:前置通知
                aop:after 后置通知
                aop:after-returning:最终通知
                aop:after-throwing:异常通知
                aop:around:环绕通知
            -->
        </aop:aspect>
    </aop:config>
</beans>
6、使用AOP
public class Test {
        public static void main(String[] args) {
        //获取IOC的容器
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器来获取当前的对象(通过无参构造来实例对象方法)

        //获取book对象
        //验证前置通知
        Book book = (Book) applicationContext.getBean("book");
        book.writeBook();
    }
}
  • 执行结果:前置通知

在这里插入图片描述

  • 注意:环绕通知:
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 增强类
 * 完成添加日志
 */
public class DiyLog {
    public void log() {
        //业务逻辑
        System.out.println("打印日志");
    }

    //环绕通知  需要通过ProceedingJoinPoint类型的参数指定增强方法执行的时机
    public void round(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("方法执行前");
        //执行增强的方法
        joinPoint.proceed();
        System.out.println("方法执行之后");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--将基本对象交给spring管理-->
    <bean id="book" class="com.test.bean.Book"/>
    <bean id="diyLog" class="com.test.bean.DiyLog"/>

    <!--配置AOP操作-->
    <aop:config>
        <!--配置切入点:使用表达式,在实际的方法上添加通知的方法称之为切入点-->
        <aop:pointcut id="pointcut1" expression="execution(* com.test.bean.Book.writeBook(..))"/>

        <!--配置切面:把增强用到方法-->
        <aop:aspect ref="diyLog">
            <!--配置增强类型   method:增强类中的那个方法作为前置增强-->
            <aop:around method="round" pointcut-ref="pointcut1"/>
            <!--
                aop:before:前置通知
                aop:after 后置通知
                aop:after-returning:最终通知
                aop:after-throwing:异常通知
                aop:around:环绕通知
            -->
        </aop:aspect>
    </aop:config>
</beans>

在这里插入图片描述

  • 执行结果(测试代码不变):环绕通知

在这里插入图片描述

基于注解的方式实现

所用实例与上述基于XML方式实现的实例相同。

1、配置XML文件
  • Bean对象装配
    • 将接触类和增强类交给IOC容器管理。
  • 在Spring的配置文件中,开启AOP操作
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd">
   
    <!--将接触类和增强类交给IOC容器管理-->
    <bean id="book" class="com.test.bean.Book7"/>
    <bean id="diyLog" class="com.test.bean.DiyLog"/>

    <!--开启AOP的操作-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
2、在增强类上添加注解
@Aspect
public class DiyLog {
    //前置增强
    @Before(value = "execution(* com.test.bean.Book.readBook(..))")
    //<aop:before method="round" pointcut-ref="pointcut1"/>
    public void log() {
        //业务逻辑
        System.out.println("打印日志");
    }
}
  • 基于注解的AOP实现方式: 在增强类上添加@Aspect注解。在该类中用哪一个方法来作为增强,就在方法上添加以下注解:
    • @Before(value = "execution(* com.test.bean.Book.readBook(..))"),前置通知。
    • @After(value = ""),后置通知。
    • @AfterThrowing,异常通知。
    • @Around(value = ""),环绕通知 ,需要在方法入参上添加ProceedingJoinPoint参数,见上面基于XML形式的具体实现。
    • @AfterReturning,最终通知。
3、使用AOP
public class Test {
    public static void main(String[] args) {
        //获取IOC的容器
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器来获取当前的对象(通过无参构造来实例对象方法)

        //获取book对象
        //验证前置通知
        Book book = (Book) applicationContext.getBean("book");
        book.readBook();
    }
}
  • 执行结果:前置通知

在这里插入图片描述

关于Kswapd的理解(一) 关于Kswapd的理解(一) 之前跟踪了MemAvailable的计算方式,其中watermark的计算花了很多精力,在学习的过程中看到一些资料中说watermark是给swapd使用的,于是乎,研究一下看看咯 本部分主要记录两个方面: 对于kswapd这个东西,从初学者(我)的角度出发会考虑哪些内容? 跟踪kswapd 初始化结构部分; 1. KSwapd机制 上图是还没有跟踪kswapd code的时候,对自己提出的一些疑问和自身的理解,主要是如下内容: kswapd 机制用来做什么:内存不足时 阅读详情

相关推荐

初识机会网络仿真器ONE中ExternalMovement移动模型(导入外部移动数据)

最近半个月一直在研究ONE中关于ExternalMovement移动模型的源代码,在网上几乎没有找到相关的资料,很是苦恼,如果有共同研究方向的小伙伴欢迎联系我,共同讨论进步。 下面记录一下几点感悟: 1、使用外部数据的前提是在ONE的配置文件中增加及修改相关代码: Group.movementModel = ExternalMovement ExternalMovement.file = move...

qq_36974792的博客 657

Spring AOP 需要包含的各种包

如果你用 spring-framework-4.2.5.RELEASE-dist 去开发基于AOP的程序,除了要安装aspectJ1.7 ,然后包含aspectJ1.7 lib 下的包外,   额外还需要包含下面的包: com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar cglib-2.2.2.jar com.springsourc

大树叶 技术专栏 5865

CANOe实战指南 - 从入门到精通的全流程解析

本文是CANOe实战指南,全面解析从入门到精通的全流程。内容涵盖CANOe软件的核心功能仿真、测试与分析,详细指导安装配置、工程创建、CAN信号收发、UDS诊断通信、CAPL自动化编程以及Panel面板设计。通过实战案例,帮助汽车电子工程师快速掌握这一行业标杆工具,构建自动化测试环境,提升开发与测试效率。

pear55的博客 574

Spring基础三(AOP)

Spring基础三—AOP 一.概述 AOP又称为面向切面编程,是对面向对象编程(OOP)的补充。一些常见的横切关注点如:日志记录,事务管理,数据验证等。在面向对象编程中,应用程序的模块化是通过类实现的,而在面向方面编程应用程序中,模块化由Aspects实现,并且它们被配置为跨越不同的类。Spring AOP从通过普通面向对象编程模型无法实现的类中获取横切任务的直接依赖性。例如,我们可以有...

我的博客 423

头歌平台 操作系统课堂练习2.3:系统调用

使用 gdb 调试内核,跟踪到 main 函数入口的方法与之前实训一样。系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?系统运行时,执行的前 3 个系统调用的编号和名字分别是什么?本关卡使用版本 1 内核进行分析,版本 1 内核文件存放在。为了完成本关任务,你需要:跟踪系统调用的发生。此时,系统调用号存放在寄存器 eax 中。

lazbuyaotoutu的博客 2万+

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2699

Spring的依赖注入和AOP使用详解

Spring的依赖注入和AOP使用详解

qq_49195366的博客 1423

浮点数加法器设计

一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算

Phoenix_ZengHao的博客 1万+

Spring 之AOP配置(五)

AOP配置专业名词有三个分别是JoinPoint(连接点)被代理对象所有的可以增强的方法PointCut(切入点)已经增强过的方法Advice(通知)增强的内容Target(目标对象)Waving(织入)将通知织入目标对象中Proxy(代理)代理对象,将通知织入到目标对象后就变成代理对象Aspect(通知加切入点)比如下面图中的标注现在开始配置1导包(需要导入aop,aspect两个jar包还有他...

qq_41934990的博客 515

FPGA+滨淞CCD实战:手把手教你搭建S7031/S10142成像电路(附避坑指南)

本文详细介绍了使用FPGA驱动滨淞CCD传感器(S7031/S10142)构建高精度成像系统的完整实战流程。内容涵盖核心器件选型、系统架构规划、电路板(焦面板与接口板)设计要点、FPGA Verilog逻辑实现,并提供了从电源管理、信号调理到数据采集的详细避坑指南,帮助读者从零搭建稳定可靠的成像电路。

weixin_29271263的博客 227

一种4位sar adc仿真验证

4位sar adc采用下图的电容阵列,电路如下图:所有电容的正端(也称为上极板)与比较器的反相端连接,比较器同相端接Vin,其工作过程进行大致分析见之前的文章《一种4位sar adc工作过程推导(三)》,下面对这个电路进行仿真验证。 两个参考电压VrefPV_{refP}VrefP​和VrefNV_{refN}VrefN​,V+=VinV_{+}=V_{in}V+​=Vin​,假设1116(VrefP−VrefN)+VrefN<Vin<1216(VrefP−VrefN)+VrefN\frac{

大学生视野 1954

spring_AOP配置相关的jar包

spring_AOP配置相关的jar包

Sky_for_me的博客 4639

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(一)校园网核心交换机配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 3795

Spring框架AOP学习总结(下)

文章目录1、 AOP 的概述1、1 为什么学习 AOP1、2 AOP底层实现: 代理机制(了解)2、 Spring 的基于 AspectJ 的 AOP 开发(XML 的方式)2.1 AOP 的开发中的相关术语:2.2 Spring 使用 AspectJ 进行 AOP 的开发入门(XML 的方式):2.2.1 引入相应的 jar 包2.2.2 引入 Spring 的配置文件2.2.3 编写目标类...

宜春 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring 框架之 AOP 原理剖析

前言 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 AOP 关注的不再是类,而是一系列类里面需要共同能力的行为。 本文内容主要包括:...

优快云 官方博客 6594

WINCC7.3破解文件

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

Spring框架的AOP使用方法

本文介绍了AOP(面向切面编程)的概念、原理及实现方式。AOP通过动态代理在不修改源代码的情况下增强业务逻辑,降低耦合度。底层实现分为JDK动态代理(针对有接口的情况)和CGLIB动态代理(无接口情况)。文章详细讲解了AOP术语(连接点、切入点、通知、切面)和五种通知类型(@Before、@After、@AfterReturning、@Around、@AfterThrowing)。重点阐述了基于AspectJ的两种AOP实现方式:注解方式(推荐)和XML配置方式,包括切入点表达式语法和增强类优先级设置。

MyNAMS的博客 1015

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring框架中对于AOP的理解

Spring AOP 通过切面封装横切关注点,实现了业务逻辑与非业务逻辑的解耦,提高了代码的复用性和可维护性。其核心是通过动态代理在目标方法执行过程中嵌入切面逻辑,常用注解式配置,广泛应用于日志、事务、安全等场景。理解 AOP 是掌握 Spring 框架的关键。

Z123C456H的博客 742

Spring框架--AOP框架

什么是 AOP 的技术? 在软件业,AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程 AOP:面向切面编程.(思想.---解决 OOP 遇到一些问题)AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存) 为什么要学习 AOP--可以在不修改源代码的前提下,对程序进行增强。运行期间,不修改源代码的情况下对已有的方法进行增强 优势(1)JDK 的动态代理技术 (2)cglib 代理技术 Joinpoint(连接点) 所谓连

2301_81535770的博客 822

Spring 框架的 AOP

Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。 在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助你对应用程序对象相互解耦和 AOP 可以帮助你从它们所影响的对象中对横切关注点解耦。AOP 是像

qq_42918433的博客 146

Spring框架-AOP

Asperct Oriented Programming 面向切面编程。是一种利用“横切”的技术(底层实现就是动态代理),对原有的业务逻辑进行拦截,并且可以在拦截的横切面上添加特定的业务逻辑,对原有的业务进行增强。基于动态代理实现在不改变原有业务的情况下,对业务逻辑进行增强。

f135917h的博客 763

【Spring框架】AOP

文章目录AOP简介AOP相关术语AOP的设计原理和思想1、AOP横向抽象技术的介绍2、使用代理模式的Java程序执行流3、Spring AOP的工作原理AOP的使用1、引入AOP需要的相关jar包2、配置XML文件3、写出相关实例(实现类和增强类)(1)基于XML配置型的实现4、配置切入点5、使用AOP(2)基于注解的方式实现4、配置XML文件5、在增强类上添加注解6、使用AOP AOP简介 AOP(全称Aspect Oriented Programming) 即:面向切面编程。 通过预编译方式和运行期间

Super_Powerbank的博客 612

Spring框架AOP思想

Spring框架AOP思想 一、AOP简介 1、AOP概念:面向切面编程,通过预编译方式和运行期动态代理,实现程序功能的统一维护的一种技术;利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、AOP功能:Aop的功能主要是为了拦截或者实现日志安全检查,一些检查的工作,aop也常用于事务管理,防止垃圾数据进入数据库。 3...

xfj_csdn的博客 257

spring框架中Aop

1,基本介绍 Spring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。 在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助...

weixin_45491031的博客 320

关于Spring框架AOP的理解

关于Spring框架AOP的个人理解 1.AOP的概念: 百度结果: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 个人理解: AOP是在不通过修改原有业务的基础上,为了增强某些业务的功能而诞生的一种编程思想,至于这个切面我希望可以通过下面的图示来说明。 AOP切面开发的理解: 正常代码是纵向开发的,然而为了解决在更改代码时防止对代码实现误改和其他原因导致源码出问题,则要在每个类都添加一个代理

qq_41978509的博客 455

Spring框架中的核心技术之AOP

Spring框架的核心技术之AOP,面向切面编程,动态代理,Spring面试必问

weixin_44362089的博客 5855

Spring框架——IOC与AOP

Spring 框架两大核心机制(IoC、AOP) IoC(控制反转)/ DI(依赖注入) AOP(面向切面编程) Spring 是一个企业级开发框架,是软件设计层面的框架,优势在于可以将应用程序进行分层,开发者可以自主选择组件。 MVC:Struts2、Spring MVC ORMapping:Hibernate、MyBatis、Spring Data 如何使用 IoC 创建 Maven 工...

追求幸福,探索未知的博客 651
上一篇: 【Spring框架】Spring的AOP介绍
下一篇: 【Spring框架】Spring的JdbcTemplate操作
Sampson_S
博客等级 码龄7年 214粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值