开源框架(面试题)

目录

1、hibernate 和 mybatis 的区别?

2、 MyBatis 的优点?

3、MyBatis 框架的缺点?

4、 SpringMVC 工作流程?

5、MyBatis 框架使用的场合?

6、Spring 中 beanFactory 和 ApplicationContext 的联系和区别?

7、 SpringIOC 注入的几种方式?

8、拦截器与过滤器的区别?

9、 SpringIOC 是什么?

10、 AOP 有哪些实现方式?

11、 解释一下代理模式?

12、Mybatis 是如何 sql 执行结果封装为目标对象?都有哪些映射形式?

13、Spring bean 的生命周期?

14、Spring 框架中都用到了哪些设计模式?

15、Spring 中的事件处理?

16、使用 Sping 框架的好处是什么?

17、解释 Spring 支持的几种 bean 的作用域?

18、在 Spring 中如何注入一个 java 集合?

19、什么是 Spring bean?

20、什么是 spring 自动装配?

21、自动装配有哪些方式?

22、自动装配有什么局限?

23、Spring 的重要注解?

24、@Component, @Controller, @Repository, @Service 有何区别?

25、列举 spring 支持的事务管理类型?

26、Spring 框架的事物管理有哪些优点?

27、Spring AOP(面向切面)编程的原理?

28、Spring MVC 框架有什么用?

29、介绍一下 WebApplicationContext?

30、SpringMVC 和 struts2 的区别有哪些?

31、Mybatis 中#{}和${}的区别是什么?

32、Spring 中@Autowire 与@Resource 的区别?

33.什么是控制反转(IOC),什么是依赖注入(DI)?

34、Spring 运行原理?

35、Spring 的事务传播行为? 

36、 SpringMVC 的运行流程?


1、hibernate 和 mybatis 的区别?

相同点:

        1)都属于 ORM 框架

        2)都是对 jdbc 的包装

        3)都属于持久层的框架

不同点:

        1)hibernate 是面向对象的,mybatis 是面向 sql 的;

        2)hibernate 全自动的 orm,mybatis 是半自动的 orm;

        3)hibernate 查询映射实体对象必须全字段查询,mybatis 可以不用;

        4)hibernate 级联操作,mybatis 则没有;

        5)hibernate 编写 hql 查询数据库大大降低了对象和数据库的耦合性,mybatis 提供动态 sql,需要手写 sql,与数据库之间的耦合度取决于程序员所写的 sql 的方法,所以 hibernate 的移植性要远大于 mybatis。

        6)hibernate 有方言夸数据库,mybatis 依赖于具体的数据库。

        7)hibernate 拥有完整的日志系统,mybatis 则相对比较欠缺。

2、 MyBatis 的优点?

         1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。

        2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;

        3、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。

        4、能够与 Spring 很好的集成;

        5、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

3、MyBatis 框架的缺点?

        (1)SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。

        (2)SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

4、 SpringMVC 工作流程?

         1、用户发送请求至前端控制器 DispatcherServlet

        2、DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。

        3、处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。

        4、DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器

        5、执行处理器(Controller,也叫后端控制器)。

        6、Controller 执行完成返回 ModelAndView

        7、HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet

        8、DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器

        9、ViewReslover 解析后返回具体 View

        10、DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)。

        11、DispatcherServlet 响应用户

5、MyBatis 框架使用的场合?

        (1)MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。

        (2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选 择。

6、Spring 中 beanFactory 和 ApplicationContext 的联系和区别?

        BeanFactory 是 spring 中较为原始的 Factory,无法支持 spring 的许多插件,如 AOP 功能、Web 应用等。 ApplicationContext 接口是通过 BeanFactory 接口派生而来的,除了具备 BeanFactory 接口的功能外,还具备资源访问、事件传播、国际化消息访问等功能。总体区别如下: 1)使用 ApplicationContext,配置 bean 默认配置是 singleton,无论是否使用,都会被实例化。优点是预先加载,缺点是浪费内存; 2)使用 BeanFactory 实例化对象时,配置的 bean 等到使用的时候才会被实例化。优点是节约内存,缺点是速度比较慢,多用于移动设备的开发; 3)没有特殊要求的情况下,应该使用 ApplicationContext 完成,ApplicationContext 可以实现BeanFactory 所有可实现的功能,还具备其他更多的功能。

7、 SpringIOC 注入的几种方式?

        构造器注入

        set 方法注入

        接口注入

8、拦截器与过滤器的区别?

        1、拦截器是基于 java 的反射机制的,而过滤器是基于函数回调

        2、拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。

        3、拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。

        4、拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。

        5、在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

9、 SpringIOC 是什么?

        Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管 理这些对象的整个生命周期。

10、 AOP 有哪些实现方式?

        实现 AOP 的技术,主要分为两大类: 静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强; 编译时编织(特殊编译器实现) 类加载时编织(特殊的类加载器实现)。 动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。JDK 动态代理、CGLIB

11、 解释一下代理模式?

        1、代理模式: 代理模式就是本该我做的事,我不做,我交给代理人去完成。就比如,我生产了一些产品,我自己不卖,我委托代理商帮我卖,让代理商和顾客打交道,我自己负责主要产品的生产就可以了。 代理模式的使用,需要有本类,和代理类,本类和代理类共同实现统一的接口。然后在 main 中调用就可以了。本类中的业务逻辑一般是不会变动的,在我们需要的时候可以不断的添加代理对象,或者修改代理类来实现业务的变更。

        2、代理模式可以分为: 静态代理 优点:可以做到在不修改目标对象功能的前提下,对目标功能扩展 缺点:因为本来和代理类要实现统一的接口,所以会产生很多的代理类,类太多,一旦接口增加方法,目标对象和代理对象都要维护。 动态代理(JDK 代理/接口代理)代理对象,不需要实现接口,代理对象的生成,是利用 JDK 的 API,动态的在内存中构建代理对象,需要我们指定代理对象/目标对象实现的接口的类型。 Cglib 代理 特点: 在内存中构建一个子类对象,从而实现对目标对象功能的扩展。

        3、使用场景: 修改代码的时候。不用随便去修改别人已经写好的代码,如果需要修改的话,可以通过代理的方式来扩展该方法。 隐藏某个类的时候,可以为其提供代理类 当我们要扩展某个类功能的时候,可以使用代理类 当一个类需要对不同的调用者提供不同的调用权限的时候,可以使用代理类来实现。 减少本类代码量的时候。 需要提升处理速度的时候。就比如我们在访问某个大型系统的时候,一次生成实例会耗费大量的时间,我们可以采用代理模式,当用来需要的时候才生成实例,这样就能提高访问的速度。

12、Mybatis 是如何 sql 执行结果封装为目标对象?都有哪些映射形式?

        第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。

        第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。 有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

13、Spring bean 的生命周期?

        1、Spring 容器根据配置中的 bean 定义中实例化 bean。

        2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。

        3、 如 果 bean 实 现 BeanNameAware 接 口 , 则工 厂 通 过 传 递 bean 的 ID 来 调 用setBeanName()。

        4 、 如 果 bean 实 现 BeanFactoryAware 接 口 , 工 厂 通 过 传 递 自 身 的 实 例 来 调 用setBeanFactory()。

        5、如果存在与 bean 关联的任何 BeanPostProcessors,则调用 preProcessBeforeInitialization()方法。

        6、如果为 bean 指定了 init 方法( <bean> 的 init-method 属性),那么将调用它。

        7 、 最 后 , 如 果 存 在 与 bean 关 联 的 任 何 BeanPostProcessors , 则 将 调 用postProcessAfterInitialization() 方法。

        8、如果 bean 实现 DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。

        9、如果为 bean 指定了 destroy 方法( <bean> 的 destroy-method 属性),那么将调用它。

14、Spring 框架中都用到了哪些设计模式?

        代理模式,在 AOP 中被使用最多。 单例模式,在 Spring 配置文件中定义 bean 的时候默认的是单例模式。

        工厂模式, BeanFactory 用来创建对象的实例。 模板方法, 用来解决重复性代码。 前端控制器,Spring 提供了 DispatcherSerclet 来对请求进行分发。视图帮助,Spring 提供了一系列的 JSP 标签。 依赖注入,它是惯穿于 BeanFactory/ApplicationContext 接口的核心理念。

15、Spring 中的事件处理?

        1、Spring 的核心是 ApplicatonContext,它负责管理 bean 的完整的生命周期。Spring 提供了以下 内 置 事 件 : ContextRefreshedEvent ContextStartedEvent ContextStoppedEvent ContextClosedEvent RequestHandleEvent

        2、由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的 接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在 设计应用程序时应注意。

        3、监听上下文事件

        4、自定义事件

16、使用 Sping 框架的好处是什么?

        1、简化开发,解耦,集成其它框架。

        2、低侵入式设计,代码污染级别级别。

         3、Spring 的 DI 机制降低了业务对象替换的复杂性,提高了软件之间的解耦。

        4、Spring AOP 支持将一些通用的任务进行集中式的管理,例如:安全,事务,日志等,从而使代码能更好的复用。

17、解释 Spring 支持的几种 bean 的作用域?

        当通过 Spring 容器创建一个 Bean 实例的时候,不仅可以完成 bean 实例的实力化,还可以为 bean 指定作用域。Spring bean 元素的支持以下 5 种作用域:Singleton:单例模式,在整个 spring IOC 容器中,使用 singleton 定义的 bean 将只有一个实例。 Prototype:多例模式,每次通过容器中的 getBean 方法获取 prototype 定义的 beans 时,都会产生一个新的 bean 的实例。 Request:对于每次 Http 请求,使用 request 定义的 bean 都会产生一个新的实例,只有在web 应用时候,该作用域才会有效。 Session:对于每次 Http Session,使用 session 定义的 Bean 都将产生一个新的实例。Globalsession:每个全局的 Http Sesisonn,使用 session 定义的本都将产生一个新的实例

18、在 Spring 中如何注入一个 java 集合?

        Spring 提供理论四种集合类的配置元素:lt;List&: 该标签用来装配 有重复值的 list 值lt;set&: 该标签用来装配没有重复值的 set 值lt;map&:该标签科以用来注入键值对 lt;props&: 该标签用来支持注入键值对和字符串类型键值对。

19、什么是 Spring bean?

        它们是构成用户应用程序主干的对象。 Bean 由 Spring IoC 容器管理。 它们由 Spring IoC 容器实例化,配置,装配和管理。Bean 是基于用户提供给容器的配置元数据创建。

20、什么是 spring 自动装配?

        就是将一个 Bean 注入到其它的 Bean 的 Property 中,默认情况下,容器不会自动装配,需要我们手动设定。Spring 可以通过向 Bean Factory 中注入的方式来搞定 bean 之间的依赖关系,达到自动装配的目的。 自动装配建议少用,如果要使用,建议使用 ByName

21、自动装配有哪些方式?

        1、no - 这是默认设置,表示没有自动装配。应使用显式 bean 引用进行装配。

        2、byName - 它根据 bean 的名称注入对象依赖项。它匹配并装配其属性与 XML 文件中由相同名称定义的 bean。

         3、byType - 它根据类型注入对象依赖项。如果属性的类型与 XML 文件中的一个 bean 名称匹配,则匹配并装配属性。

        4、构造函数 - 它通过调用类的构造函数来注入依赖项。它有大量的参数。

         5、autodetect - 首先容器尝试通过构造函数使用 autowire 装配,如果不能,则尝试通过byType 自动装配。

22、自动装配有什么局限?

        1、覆盖的可能性 - 您始终可以使用 <constructor-arg> 和 <property> 设置指定依赖项,这将覆盖自动装配。

        2、基本元数据类型 - 简单属性(如原数据类型,字符串和类)无法自动装配。

        3、令人困惑的性质 - 总是喜欢使用明确的装配,因为自动装配不太精确。

23、Spring 的重要注解?

        @Controller - 用于 Spring MVC 项目中的控制器类。

        @Service - 用于服务类。

        @RequestMapping - 用于在控制器处理程序方法中配置 URI 映射。

        @ResponseBody - 用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应。

        @PathVariable - 用于将动态值从 URI 映射到处理程序方法参数。

        @Autowired - 用于在 spring bean 中自动装配依赖项。

        @Qualifier - 使用

        @Autowired 注解,以避免在存在多个 bean 类型实例时出现混淆。

        @Scope - 用于配置 spring bean 的范围。

        @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。

        @Aspect,@Before,@After,@Around,@Pointcut - 用于切面编程(AOP)。

24、@Component, @Controller, @Repository, @Service 有何区别?

        1、 @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

        2、@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。

        3、@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。

        4、@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 SpringDataAccessException。

25、列举 spring 支持的事务管理类型?

         Spring 支持两种类型的事务管理: 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维 护起来非常困难。 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML 的配置来管理 事务。

26、Spring 框架的事物管理有哪些优点?

        1、它为不同的事务 API(如 JTA, JDBC, Hibernate, JPA, 和 JDO)提供了统一的编程模型。

        2、它为编程式事务管理提供了一个简单的 API 而非一系列复杂的事务 API(如 JTA).

        3、它支持声明式事务管理。 4、它可以和 Spring 的多种数据访问技术很好的融合。

27、Spring AOP(面向切面)编程的原理?

        1、AOP 面向切面编程,它是一种思想。它就是针对业务处理过程中的切面进行提取,以达到优化代码的目的,减少重复代码的目的。 就比如,在编写业务逻辑代码的时候,我们习惯性的都要写:日志记录,事物控制,以及权限控制等,每一个子模块都要写这些代码,代码明显存在重复。这时候,我们运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响主业务逻辑的部分抽取出来,放在某个地方进行集中式的管理,调用。 形成日志切面,事物控制切面,权限控制切面。 这样,我们就只需要关系业务的逻辑处理,即提高了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思想,它是面向对象编程思想的一种扩展。

        2、AOP 的使用场景: 缓存、权限管理、内容传递、错误处理、懒加载、记录跟踪、优化、校准、调试、持久化、资源池、同步管理、事物控制等。 AOP 的相关概念: 切面(Aspect)连接点(JoinPoint) 通知(Advice) 切入点(Pointcut) 代理(Proxy): 织入(WeaVing)

        3、Spring AOP 的编程原理? 代理机制 JDK 的动态代理:只能用于实现了接口的类产生代理。Cglib 代理:针对没有实现接口的类产生代理,应用的是底层的字节码增强技术,生成当前类的子类对象。

28、Spring MVC 框架有什么用?

        Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

29、介绍一下 WebApplicationContext?

        WebApplicationContext 是 ApplicationContext 的扩展。它具有 Web 应用程序所需的一些额外功能。它与普通的 ApplicationContext 在解析主题和决定与哪个 servlet 关联的能力方面有所不同。

30、SpringMVC 和 struts2 的区别有哪些?

        一、拦截机制的不同 Struts2 是类级别的拦截,每次请求就会创建一个 Action,和 Spring 整合时 Struts2 的ActionBean 注入作用域是原型模式 prototype,然后通过 setter,getter 吧 request 数据注入到属性。Struts2 中,一个 Action 对应一个 request,response 上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2 中 Action 的一个方法可以对应一个 url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。 SpringMVC 是方法级别的拦截,一个方法对应一个 Request 上下文,所以方法直接基本上是独立的,独享 request,response 数据。而每个方法同时又何一个 url 对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过 ModeMap 返回给框架。在 Spring整合时,SpringMVC 的 Controller Bean 默认单例模式 Singleton,所以默认对所有的请求,只会创建一个 Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope 注解修改。 Struts2 有自己的拦截 Interceptor 机制,SpringMVC 这是用的是独立的 Aop 方式,这样导致 Struts2 的配置文件量还是比 SpringMVC 大。

        二、底层框架的不同 Struts2 采用 Filter(StrutsPrepareAndExecuteFilter)实现 ,SpringMVC(DispatcherServlet)则采用 Servlet 实现。Filter 在容器启动之后即初始化;服务停止以后坠毁,晚于 Servlet。Servlet在是在调用时初始化,先于 Filter 调用,服务停止后销毁。 三、性能方面 Struts2 是类级别的拦截,每次请求对应实例一个新的 Action,需要加载所有的属性值注入,SpringMVC 实现了零配置,由于 SpringMVC 基于方法的拦截,有加载一次单例模式 bean注入。所以,SpringMVC 开发效率和性能高于 Struts2。 四、配置方面 spring MVC 和 Spring 是无缝的。从这个项目的管理和安全上也比 Struts2 高。

31、Mybatis 中#{}和${}的区别是什么?

         #{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;Mybatis 在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止 SQL 注入,提高系统安全性。

32、Spring 中@Autowire 与@Resource 的区别?

         @Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为 null,可以设置它 required 属性为 false,如果我们想使用按照名称装配,可以结合@Qualifier 注解一起使用;

        @Resource 默认按照名称装配,当找不到与名称匹配的 bean 才会按照类型装配,可以通过name 属性指定,如果没有指定 name 属性,当注解标注在字段上,即默认取字段的名称作为 bean 名称寻找依赖对象,当注解标注在属性的 setter 方法上,即默认取属性名作为 bean名称寻找依赖对象

33.什么是控制反转(IOC),什么是依赖注入(DI)?

         IOC:就是对象之间的依赖关系由容器来创建,对象之间的关系本来是由我们开发者自己创建和维护的,在我们使用 Spring 框架后,对象之间的关系由容器来创建和维护,将开发者做的事让容器做,这就是控制反转。BeanFactory 接口是 Spring Ioc 容器的核心接口。

        DI:我们在使用 Spring 容器的时候,容器通过调用 set 方法或者是构造器来建立对象之间的依赖关系。 控制反转是目标,依赖注入是我们实现控制反转的一种手段。

34、Spring 运行原理?

        1、内部最核心的就是 IOC 了,之前是 new 对象,现在可以直接从容器中获取, 动态注入,这其实就是利用 java 里的反射。反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,根据 xml Spring 的配置文件来动态的创建对象,和调用对象里的方法的。

        2、Spring 另一个核心就是 AOP 面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。(日志、事务等)

        3、Spring 目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明 管理的(Spring 根据这些配置 内部通过反射去动态的组装对象)要记住:Spring 是一个容器,凡是在容器里的对象才会有 Spring 所提供的这些服务和功能。

        4、Spring 里用的最经典设计模式:模板方法模式。(有兴趣同学可以了解一下) 、核心容器组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

35、Spring 的事务传播行为? 

36、 SpringMVC 的运行流程?

        DispatcherServlet 前置控制器 |HandlerMapping 请求映射(到 Controller) |HandlerAdapter 请求映射(到 Controller 类的方法上)|Controller 控制器|HandlerIntercepter 拦截器|ViewResolver 视图映射|View 视图处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

失忆机器

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

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

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

打赏作者

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

抵扣说明:

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

余额充值