如何在spring boot中获取所有RequestMapping的URL路径列表集?

Feign重写URL以及RequestMapping Feign重写URL以及RequestMapping背景场景效果展示整体思路实现Feign的服务端层1. 继承RequestMappingHandlerMapping,重写getMappingForMethod2. 服务层ControllerFeign的客户端配置重写Feign的上下文SpringMvcContract最后还有一处修改 背景 由于项目采用的是 消费层 + API层(FeignClient) +服务层 的方式。 导致原项目有太多代码冗余复制的地方。例如FeignClient上要写@Requ 阅读详情

本文是“著”模式。但是本文写完之后,我直接搜索了一下结论的核心,发现好些达人都已经实现了,无知好尴尬……

 

为什么要做这事儿?

自动化、可视化、授权……总之,谁用谁知道

 

如何在Controller类的方法内获取到系统内已存的所有RequestMapping的路径列表集?

简单来说:在带有@Controller注解的类中,添加以下的代码:

@Autowired
ApplicationContext applicationContext;
public void getAllRequestMappingInfo() {
    AbstractHandlerMethodMapping<RequestMappingInfo> objHandlerMethodMapping = (AbstractHandlerMethodMapping<RequestMappingInfo>)application.getBean(“requestMappingHandlerMapping”);
    Map<RequestMappingInfo, HandlerMethod> mapRet = objHandlerMethodMapping.getHandlerMethods();
}

实现过程,没仔细看书,只能蛮力调试了。

本文基于的主要库版本:

spring-boot:1.5.2.RELEASE

*spring-xx:4.3.7.RELEASE

*:spring-xx中的xx包含core、context、beans等

 

以下是调试流程:

1、在项目的App.main方法(App类有@SpringBootApplication注解)中,使用SpringApplication.run方法,最终会创建一个SpringApplication类的对象,并调用其run(String…args)方法;

2、在run方法中,使用SpringApplication.createApplicationContext()方法,创建了ApplicationContext对象,其具体类型由SpringApplication对象属性的webEnvironment布尔值所决定,由于后者的值为true,因此ApplicationContext对象被初始化为org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext类型;run方法内将创建的对象临时赋值给了方法体内定义的context(ConfigurableApplicationContext类型)局部变量;再具体的细节这里不表;

3、run方法内,继续到this.refreshContext(context),在后者内调用refresh方法;

4、refresh最终会调用org.springframework.context.support.AbstractApplicationContext类的refresh方法;

5、在AbstractApplicationContext.refresh方法内,调用finishBeanFactoryInitialization方法对GenericApplicationContext.beanFactory成员变量进行初始化(GenericApplicationContext类是直接从AbstractApplicationContext类派生出来的,后者并没有定义beanFactory成员变量,但是定义了一个抽象方法getBeanFactory,其实获取的就是前者的成员变量,因为前者不仅定义了成员变量,而且也实现了这个抽象方法),这个beanFactory成员变量在GenericApplicationContext类的构造函数里被创建,其类型为DefaultListableBeanFactory;

6、再回到finishBeanFactoryInitialization方法内,beanFactory会调用DefaultListableBeanFactory.preInstantiateSingletons方法,暂停一下,我们下面说一个beanFactory;

6.1、在第2步的run方法内使用createApplicationContext方法创建上下文时,会通过org.springframework.beans.BeanUtils类,最终在org.springframework.context.annotation.AnnotationConfigUtils类内的registerAnnotationsConfigProcessors方法中,对beanFactory进行一些初始化。beanFactory对象的beanDefinitionNames成员变量(ArrayList)保存着系统内的bean名称(这里,我觉得使用GenericApplicationContext.getDefaultListableBeanFactory()方法可以获取到beanFactory,然后进行获取到bean名称集)

6.2、接上面,在AnnotationConfigUtils.registerAnnotationsConfigProcessors方法内,会对beanFactory对象实际添加几个系统内最初的bean,将其名称保存在DefaultListableBeanFactory的beanDefinitionNames成员变量内,将<bean名称,对象>保存在beanDefinitionMap成员变量内。整个系统内的第一个bean名称是org.springframework.context.annotation.internalConfigurationAnnotationProcessor,其值为org.springframework.beans.factory.support.RootBeanDefinition类型的对象,且后者传进去的参数为org.springframework.context.annotation.ConfigurationClassPostProcessor类型。

6.3、whatever,最终在DefaultListableBeanFactory.registerBeanDefinition方法内,对bean进行添加。总之,在AnnotationConfigUtils.registerAnnotationsConfigProcessors方法内,会最终人为的添加6个bean:

名称

对象类型

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.context.annotation.ConfigurationClassPostProcessor

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

org.springframework.context.annotation.internalRequiredAnnotationProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor

org.springframework.context.annotation.internalCommonAnnotationProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor

org.springframework.context.annotation.internalPersistenceAnnotationProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.context.event.EventListenterMethodProcessor

org.springframework.context.event.internalEventListenerFactory

org.springframework.beans.factory.support.RootBeanDefinition类型,参数为org.springframework.context.event.DefaultEventListenerFactory

 

7、回到AbstractApplicationContext.refresh方法内,在其中的this.invokeBeanFactoryPostProcessors步骤,会扫描获取到系统内自定义的所有的bean名称,并将其装入到beanFactory对象内。

8、在AbstractApplicationContext.finishBeanFactoryInitialization方法内,beanFactory对象使用preInstantiateSingletons方法,对单件bean对象进行预初始化;

9、单件的bean对象很多,比如requestMappingHandlerMapping就是其中之一,还有error、beanNameHandlerMapping等等;

10、这里我们主要看名称为requestMappingHandlerMapping的bean,这个名称的bean最终通过一系列手段会对应org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping类型的对象;

11、RequestMappingHandlerMapping类对象在创建后,会调用bean的一个约定方法(它本身改写了)afterPropertiesSet(),然后在其中又调用了它的父类AbstractHandlerMethodMapping的afterPropertiesSet()方法,后者内调用了initHandlerMethods()方法;

11.1、在AbstractHandlerMethodMapping.initHandlerMethods方法内,首先会获取到系统内所有的bean names,然后一一枚举这些bean,主要是为了判断bean对象的类上有没有@Controller注解,或者方法上是不是有@RequestMapping注解。这个实现是通过这种方式达成的:RequestMappingHandlerMapping类实现了AbstractHandlerMethodMapping定义的抽象方法isHandler(),在前者的实体内,

12、在AbstractHandlerMethodMapping.initHandlerMethods方法内,会通过detectHandlerMethods()方法->registerHandlerMethods()方法,最终调用内部类AbstractHandlerMethodMapping.MappingRegistry的register方法,将@RequestMapping注解后的mapping字符串、Controller类对象、Mehod对象三者存放在MappingRegistry类对象的成员变量mappingLookup这个Map<T,HandlerMethod>类型的映身内,后者是一个LinkedHashMap类型的映射;

13、MappingRegistry类提供了getMapping()方法返回mappingLookup成员变量的引用;

14、AbstractHandlerMethodMapping类提供了getMappingRegistry()方法,返回MappingRegistry类对象,但是这个方法并不是一个public方法,因此只能在org.springframework.web.servlet.handler包内被使用了。

15、RequestMappingHandlerMapping类从AbstractHandlerMethodMapping类派生而来,通过getBean()方法,能够获取到其对象,但由于14步的影响,还是无法获取到@RequestMapping的路径;

16、另外一种方法,AbstractHandlerMethodMapping类内提供了一个公共的方法getHandlerMethods(),这个方法返回MappingRegistry类的mappingLookup成员变量的不可更改视图;AbstractHandlerMethodMapping类还提供了其他几个有用的方法,暂时略过;

17、ApplicationContext可使用ApplicationObjectSupport.getApplicationContext()方法获取;所有的bean names可通过org.springframework.beans.factory.ListableBeanFactory.getBeansNamesForType()方法获取到(此方法真正在org.springframework.beans.factory.support.DefaultListableBeanFactory类内被实现;

 

 

其他有用的方法:

1、如何通过bean名称获取bean的实际类型?

使用org.springframework.beans.factory.BeanFactory接口提供的getType方法(此方法在ApplicationContext被实现了)

 

最后,其实,在使用springboot调试时,控制台的输出信息里,已经打印出了所有映射路径及对应的处理方法信息,比本文最开始的方法打印的更全(本文仅做了RequestMappingHandlerMapping)

 

 

事后发现的一些达人的文章:

SpringMVC项目中获取所有URL到Controller Method的映射:http://www.cnblogs.com/yuananyun/archive/2014/08/25/3934371.html

Spring 反射得到所有controller与method:http://183615215-qq-com.iteye.com/blog/1866281

 

 


Spring Boot @GetMapping注解深度解析:从基础语法到高级实战避坑指南 在Web开发领域,请求映射是构建RESTful API的核心基础,它定义了客户端请求与服务器端处理逻辑之间的桥梁。其原理是通过注解将HTTP请求的路径、方法、参数等元信息与特定的控制器方法进行绑定,实现请求的路由与分发。掌握请求映射技术对于构建清晰、高效、可维护的后端服务至关重要,它能显著提升接口的健壮性和开发效率。在实际的工程实践中,开发者常需处理路径变量、参数绑定、内容协商等复杂场景,并规避路径匹配冲突、版本升级适配等常见陷阱。本文聚焦Spring Boot框架中的@GetMapping注解,深入剖析其 阅读详情

相关推荐

Spring Boot整合Spring Security实现JWT无状态认证实战指南

在微服务架构和前后端分离的现代Web开发中,认证与授权是保障系统安全的核心环节。传统的基于Session的认证方式在分布式场景下面临扩展性和跨域挑战,因此无状态认证方案应运而生。JWT(JSON Web Token)作为一种开放标准,通过将用户信息编码为JSON对象并签名,实现了安全、自包含的身份凭证传输。其技术价值在于彻底解耦了服务端会话状态,显著提升了系统的可扩展性和跨域支持能力,尤其适用于RESTful API和微服务间的安全通信。结合Spring Security这一强大的Java安全框架,开发者可

weixin_34008933的博客 1250

spring boot中获取所有RequestMapping的URL路径列表集

spring boot 项目在做URL权限控制的时候需要获得全部的URL,一个一个去controller中找费时费力,有的权限点的命名和URL有一定的对应关系。如果能用程序获得全部URL,将会省去很多事。在项目中添加如下Controller,请求/getAllUrl,即可看到项目所有的URL。当然也可以根据项目将URL写入数据库或写入配置文件。 @Autowired WebApplicat...

tt____tt的专栏 3万+

Spring Boot整合OAuth2:从授权协议到微服务安全实战

在现代应用开发中,授权是保障系统安全与用户体验的核心环节。OAuth2作为一种行业标准的授权协议,其核心原理在于通过令牌(Token)机制,允许第三方应用在用户授权后访问其资源,而无需获取用户密码,从而实现了认证与授权的安全解耦。这一机制的技术价值在于提供了安全、标准化的授权流程,极大地简化了多平台登录、API资源访问等场景的开发复杂度。其典型的应用场景包括第三方登录(如微信、GitHub登录)、微服务间的安全通信以及构建统一单点登录(SSO)系统。本文聚焦于如何在Spring Boot生态中高效整合OAu

weixin_34275734的博客 495

springboot手把手教你0基础了解 请求映射原理 springboot第六期

文章目录doGet的实现过程 doGet的实现过程 HttpServlet生命了doGet方法 然后他的子类FrameworkServlet的doGet方法和dopost里面实际上执行的都是processRequest方法 processRequest这个方法里面起主要作用的try里面的哪一行 也就是这里 但是点进去看这玩意是个抽象方法 这个方法的实现在它的子类里面 也就是下面这个 这个子类里面的doservice里面又很多东西 但是都不用看 里面起主要作用的是 protected void d

qq_47431361的博客 873

IntelliJ IDEA创建Spring Boot项目:从环境配置到第一个接口的完整指南

在Java企业级开发中,Spring Boot以其“约定大于配置”的理念,通过自动配置机制和Starter依赖,极大地简化了基于Spring框架的应用搭建过程。其核心价值在于提供了一套标准化的项目结构和开箱即用的功能模块,让开发者能够快速构建生产级的独立应用。在实际工程实践中,开发者通常借助集成开发环境(如IntelliJ IDEA)和构建工具(如Maven)来高效管理项目生命周期。本文聚焦于使用IDEA的Spring Initializr向导,详细演示如何配置JDK、选择依赖(如Spring Web、Lo

weixin_34310369的博客 482

Spring Boot中Druid监控AOP配置详解:从原理到多数据源实战

在Java应用开发中,数据库连接池是提升性能与稳定性的核心组件。其工作原理是通过管理数据库连接的创建、复用与销毁,有效减少资源开销。面向切面编程(AOP)作为一种编程范式,允许开发者将横切关注点(如日志、监控)模块化。将AOP机制应用于数据库操作监控,能够实现无侵入式的SQL执行追踪与性能分析,这对于定位慢查询、优化数据访问层具有极高的技术价值。在Spring Boot生态中,整合Druid连接池并配置其AOP监控,是监控**Service层方法**与底层**SQL执行**关联关系的关键实践。通过正确配置`

aibiba0894的博客 844

springboot 获取请求映射路径(url)

/todo 用途。

qq_35268926的博客 4458

URL在MVC中的核心作用:从路由匹配到语义驱动

URL不仅是HTTP请求的地址标识,更是现代Web框架中实现资源定位、操作分发与语义表达的基础载体。其本质是请求路径与控制器方法之间的映射契约,依赖路由匹配算法(如AntPathMatcher、Trie树)、参数绑定机制及HTTP方法协同完成调度。理解URL解析原理,有助于规避404路由冲突、参数注入失败、版本化混乱等高频问题;掌握正则匹配性能陷阱、RESTful语义对齐、反向路由生成等关键技术,可显著提升API设计合理性与系统可维护性。本文聚焦Spring MVC等主流框架中URL的全生命周期管理,覆盖标

aobai7842的博客 390

获取spring-boot-starter项目中所有可访问的RequestMapping路径

/** * 获取所有web请求路径 * * @return */ List<String> getPath(String contextPath) { List<String> list = new ArrayList<>(); // 获取request HttpServletRequest req = ((ServletRequestAttributes) ...

qq_27577113的博客 1063

Spring Boot 2.7.0新手入门:从环境搭建到RESTful API开发实战

Spring Boot作为Java后端开发的主流框架,通过自动配置和起步依赖机制,极大地简化了传统Spring应用的初始搭建和开发过程。其核心原理是基于条件化配置,根据类路径下的依赖自动装配Bean,实现了“约定大于配置”的理念,显著提升了开发效率。这一技术价值在于让开发者能够快速构建独立运行、生产级的应用,尤其适合微服务架构和云原生场景。在具体应用场景中,开发者只需通过Spring Initializr初始化项目,添加如Web、Lombok等起步依赖,即可快速开发RESTful API。本文以Spring

weixin_30791095的博客 420

获取RequestMapping所有的方法和路径|SpringMvc的Controller

通过编译文件的class路径,反射得到Class,获取RequestMapping对应注解和value路径

spring boot中获取所有RequestMapping的URL路径列表集:

package com.xn.bmpos.api.bmposapi.controller; import net.sf.json.JSONArray; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMappin...

qq_28287111的博客 1251

车载测试面试题总结

首先确认是什么问题,如果是测试软件的问题就先确定自己的测试方法有没有问题,如果没有问题,那就是测试软件的问题,这时候就需要提bug 进行跟踪,(比如BCM测试的时候,先明确测试的输入,对输入)进行需求分析,然后设计测试用例,进行用例评审,评审完执行测试用例形成最终的版本,台架分为:hil(黑尔)台架,单个控制器的台架、整车台架、车身台架、动力系统台架等,主要验证其功能,或者实车无法满足的测试环境。这个人不可能一直,点击几千次或者多少次几个小时连续点击,人不可能一直在点。因为要模拟一下这个稳定性,

woaxiaoqing的博客 7812

Spring Boot集成阿里云OSS:从零构建安全高效的文件存储服务

对象存储(OSS)作为一种云存储服务,其核心原理是将数据、元数据和唯一标识符封装为独立对象进行管理,摒弃了传统文件系统的目录树结构。这种设计带来了近乎无限的扩展性、高可靠性和高并发访问能力,使其成为存储图片、视频等静态资源的理想选择。在技术价值层面,OSS通过按需付费模式显著降低了硬件和维护成本,同时提供了丰富的SDK和API支持,便于开发者快速集成。在应用场景上,它广泛用于用户上传内容管理、静态资源托管、备份归档等。本文聚焦于阿里云OSS,通过实战演示如何在Spring Boot项目中配置Bucket权限

weixin_30493401的博客 375

机械臂 关节电机选型计算

电机 机械臂

hisen92的专栏 8982

数字电路与逻辑设计——组合逻辑篇

在数字电路中,根据逻辑功能的不同而分为两大类,组合逻辑电路与时序逻辑电路。 1、何为组合逻辑电路 我们只需铭记一点就是,这种电路的输出Y只与当时的输入X有关,而与之前的输入X’无关。所以这是一个可以随输入X的变化而瞬变输出Y的电路,如果用我们的Verilog代码来表示,则可能会出现在如下语句中: ①针对wire型变量,assign Y = X1 && X2; ②针对reg型变量,alway

蓝湖江船客的博客 1万+

Spring Boot化妆品销售系统:从零搭建B2C电商后台实战指南

Spring Boot作为Java领域主流的Web应用开发框架,其核心原理在于通过约定大于配置和自动装配机制,极大地简化了基于Spring的应用程序创建和部署流程。这一技术价值在于能够帮助开发者快速构建独立、生产级的应用,特别适合用于开发企业级后台管理系统。在电商、零售等应用场景中,基于Spring Boot构建的B2C销售系统能够高效处理用户、商品、订单等核心业务模块。本文以化妆品销售系统为例,详细拆解了如何利用Spring Boot技术栈,结合Spring Data JPA和MySQL数据库,实现一个包

weixin_33795093的博客 379

✨在Windows11上安装虚拟机(VMware17.6.0)保姆级教程(附安装包)

VMware Workstation Pro 是一款功能强大的虚拟机软件,它允许你在单一的物理机上运行多个操作系统。性能卓越:VMware以其出色的性能和稳定性而闻名,适合运行资源密集型的虚拟机。用户友好:直观的用户界面使得即使是初学者也能快速上手。功能全面:支持多种操作系统,包括Windows、Linux、macOS等,满足不同用户的需求。企业级支持:VMware提供全面的技术支持,适合企业级用户。恭喜你成功安装了VMware Workstation Pro 17.6.0!

Python老吕的博客 1万+

Spring Boot实战:流浪动物救助系统全栈开发指南

Java Web开发是构建企业级应用的核心技术,其通过分层架构实现业务逻辑与数据管理的解耦。Spring Boot作为主流框架,通过自动配置和起步依赖,极大地简化了基于Spring应用的初始搭建和开发过程,其核心价值在于提升开发效率、降低配置复杂度并促进微服务架构的实施。在公益信息化、社区管理等应用场景中,这类技术常被用于快速构建可落地的管理系统。本文聚焦于一个典型的实战案例——流浪动物救助系统,详细阐述了如何利用Spring Boot整合MyBatis、Thymeleaf等技术栈,实现用户管理、动物信息登

weixin_30606461的博客 310

第二十一:Python接口自动化-处理Json数据

【代码】第二十一:Python接口自动化-处理Json数据。

欢迎来到本博客! 111

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 2919

【Java EE】Spring Web MVC 请求与响应的全过程

Spring MVC是Java Web开发的核心框架,基于MVC设计模式实现前后端交互。它将应用分为Model(业务逻辑)、View(数据展示)和Controller(请求调度)。Spring Boot作为开发脚手架,通过集成Spring MVC(spring-web依赖)提供Web能力。核心流程包括:1) 建立连接:使用@RequestMapping绑定URL与方法;2) 获取参数:支持普通参数、对象、数组、集合及@RequestParam重命名;3) 返回响应。适用于前后端分离场景,后端主要

记录了从0学习Java技术栈的日常 806

IP-Guard安全网关实例

企业相关情况: 1.OA系统,主要为日常工作使用,该系统IP为192.168.1.2,端口为8080; 2.文件共享服务器,用于存放日常工作资料和文档,该文件共享服务器的IP为192.168.1.1,其中\\192.168.1.1\private 目录中的存放着公司重要文档,不能随意外传; 3.安全网关已采用串联的方式联入网络,IP为192.168.2.6,所有机器访问OA系统和文件共享服务...

IP-Guard专栏 705

Spring Boot微服务集成实战:构建高可用REST API与异步消息通信

在分布式系统架构中,系统间集成与数据同步是核心挑战,涉及如何实现不同服务或模块间高效、可靠的数据交互与流程协同。其基本原理通常基于HTTP协议、消息队列等中间件技术,通过定义清晰的API契约和数据模型来实现通信。从技术价值看,良好的集成方案能提升系统解耦性、可扩展性和整体韧性,是构建微服务生态的关键。常见的应用场景包括跨系统数据同步、状态上报、指令下发以及事件驱动架构的实现。本文以Spring Boot微服务为例,深入探讨了如何通过设计健壮的RESTful API、集成Resilience4j熔断器与重试机

weixin_30376083的博客 404

YOLOv11涨点改进| TGRS 2026 顶刊| 注意力改进篇| 引入MSEA多尺度边缘感知注意力,助力红外小目标检测、遥感目标检测、工业缺陷检测、图像去雨雾任务高效涨点

🔥本文提出了一种基于MSEA多尺度边缘感知注意力的YOLOv11改进模型,通过增强网络对边缘、纹理和细粒度信息的感知能力,显著提升复杂背景下的目标检测性能。MSEA模块采用多尺度空洞卷积提取上下文特征,并通过边缘监督和注意力融合机制强化目标边界信息。实验表明该方法在小目标、边界模糊目标和复杂纹理目标检测任务中表现优异,尤其在遥感、工业缺陷和红外检测等场景具有显著优势。文章详细介绍了MSEA的结构原理、核心代码实现、模块配置方法以及三种YOLOv11改进方案.

Ai缝合怪、助力小伙伴高效发论文 180

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: wordybear之STS下spring boot、mybatis多数据源配置完全攻略及源码工程
下一篇: IIS服务器配置文件路径及相关说明
smartcore
博客等级 码龄19年 30粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值