Spring笔记

1、Spring介绍

(1)、Spring是一个主流的Java Web 开发框架

(2)、Spring为简化企业级开发而生,使用Spring开发可以将Bean对象,Dao组件对象,Service组件对象等交给Spring容器来管理,这样使得很多复杂的代码在Spring中开发却变得非常的优雅和简洁,有效的降低代码的耦合度,极大的方便项目的后期维护、升级和扩展。

(3)、以 IOC(Inverse of Control,控制反转;依赖注入DI (Dependency Injection))和 AOP(Aspect Oriented Programming,面向切面编程)为内核,使用基本的 JavaBean 完成以前只可能由 EJB 完成的工作,取代了 EJB 臃肿和低效的开发模式。

IOC即“控制反转”,不是什么技术,而是一种设计思想,Ioc意味着将你设计好的对象交给容器控制,就是由spring来负责控制对象的生命周期和对象间的关系。IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的

Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc、spring boot只是其中一个开源项目。

springboot项目是从远程服务器进行创建的。

2、Mapper.xml

id:是dao层接口的方法名字, ​ parameterType:dao层方法的参数类型 ​ resultType:是返回的结果集类型,取决于查询后的结果(dao层方法前面的返回值),

一般直接单表查询 ​ 可以直接使用mybatis-config.xml的简称 ​ resultMap:自定义返回值结果集 一般多表联查使用

标签 结果集映射(配置实体类属性与数据库字段关联关系)-->

    <resultMap id="menu" type="menu">
    <!--  property 实体类的属性(pojo)    column数据库表中的列     -->
        <id property="id" column="menu_id"></id>
        <result property="title" column="menu_name"></result>
        <result property="menu_url" column="menu_url"></result>
        <result property="menu_pid" column="menu_pid"></result>
    </resultMap>

代码自动补全快捷键:Ctrl+Alt+V

3、注解作用与原理

@responseBody作用:

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,它的效果等同于通过response对象输出指定格式的数据。

@ResponseBody会把该方法的返回值转成json格式,通过响应流的方式返回给浏览器

@Controller

@Controller把当前JavaBean交给Spring管理 控制反转

@RequestMapping

@RequestMapping("/User") 把类映射到指定路径上

@Autowire 怎么使用名称来注入

配合 @Qualifier 使用,如下所示:

@Component
public class Test {
    @Autowired
    @Qualifier("userService")
    private UserService userService;
}

4、MyBatis--动态sql(where标签用法)

where标记的作用类似于动态sql中的set标记,他的作用主要是用来简化sql语句中where条件判断的书写的

where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果where后面的字符串是以and 和or 开头的,就将他们剔除。

5、Spring中bean标签的属性和值:

id属性:用于指定Bean的名称,在Bean被依赖时使用,在获取Bean时使用等

name属性:用于指定Bean的别名

class属性:用于指定Bean的来源,即创建要创建的Bean的class类(需要全限定名)

init-method属性:用于指定当前Bean的初始化方法,在Bean实例创建好后,首先会调用其指定名称的方法

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

说几种比较常见的:

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。

  • 代理设计模式 : Spring AOP 功能的实现。(AOP 面向切面编程)

  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。(面试手写)

  • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

如何开启Spring AOP?

(1)添加依赖,在classpath中添加aspectjweaver.jar

(2)添加配置   //在配置类上添加@EnableAspectJAutoProxy

AOP的使用场景?

  • 事务, 在标注 @Transactional 注解的方法上, 可以实现自动开启 / 提交 / 回滚事务
  • 日志, 记录方法执行前的入参和执行后的结果
  • 当需要实现分布式锁时, 可以利用 AOP 和自定义注解的方式, 在 Service 执行前上锁, 执行结束后解锁

单例模式的使用场景?

  •  资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。 
  •  控制资源的情况下,方便资源之间的互相通信。如线程池等。 

单例模式的几种实现:

(1)饿汉式—静态常量方式(线程安全)

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

(2)懒汉式(双重检查)

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        //双重检查
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

(3)双重校验锁(线程安全,效率高)

public class Singleton {
	private volatile static Singleton singleton;
	private Singleton() {}
	public static Singleton getSingleton() {
		if (singleton == null) {
			synchronized (Singleton.class) {
				if (singleton == null) {
						singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

7、Spring 管理事务的方式有几种?

  • 编程式事务,在代码中硬编码。(不推荐使用)

  • 声明式事务,在配置文件中配置(推荐使用)

声明式事务又分为两种:

  • 基于XML的声明式事务

  • 基于注解的声明式事务

8、ajax data携带参数

serialize()序列化方法

//表单传值,如果都是input里包含的值 发送ajax时可以使用serialize()方法,
//写法为 data: $('#ed_form').serialize(), //#ed_form为表单form标签里的id值,
data: $("#book-form").serialize(),

9、ajax同步和异步

** ajax异步请求:**

异步请求就当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。 一般默认值为true,异步。

(可以同时执行多个事情)

** ajax同步请求:**

同步是一步一步来操作,等待请求返回的数据,再执行下一步,那么一定会有一些情况,只有这一步执行完,拿到数据,通过获取到这一步的数据来执行下一步的操作。这是异步没有办法实现的,因此同步的存在一定有他存在的道理。

(把当前的事情处理完才能处理下一个事情)

客户端向服务器提交的数据量很小。这时候用同步,反之,其他时候用异步。

async: false,//异步改同步

10、var和let的区别

1、作用域不同

var是函数作用域,let是块作用域。

在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for循环以外也是可以访问的

而let由于是块作用域,所以如果在块作用域内定义的变量,比如说在for循环内,在其外面是不可被访问的,所以for循环推荐用let

2、let不能在定义之前访问该变量,但是var可以。

let必须先声明,在使用。而var先使用后声明也行,只不过直接使用但没有定义的时候,其值是undefined。var有一个变量提升的过程,当整个函数作用域被创建的时候,实际上var定义的变量都会被创建,并且如果此时没有初始化的话,则默认为初始化一个undefined

3、let不能被重新定义,但是var是可以的

let = 1; let = 2;

11、mybatis动态sql foreach的用法

foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。

 在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  • 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .

  • 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .

  • 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名*,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key. 

  • collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array     item : 表示在迭代过程中每一个元素的别名     index :表示在迭代过程中每次迭代到的位置(下标)     open :前缀     close :后缀     separator :分隔符,表示迭代时每个元素之间以什么分隔 我们通常可以将之用到批量删除、添加等操作中。

12、label 的for属性

  1. 定义:for属性规定label与哪个表单元素绑定。

是专门为元素服务的,为其定义标记。

label 和表单控件绑定方式有两种:

方法一:将表单控件作为label的内容,这种就是隐士绑定。

此时不需要for属性,绑定的控件也不需要id属性。

隐式绑定:
<label>Date of Birth: <input type="text" name="DofB" /></label>

方法二:为label标签下的for属性命名一个目标表单的id,这种就是显示绑定。

显式绑定:
<label for="SSN">Social Security Number:</label>
<input type="text" name="SocSecNum" id="SSN" />

二、为什么要给label上面加上for属性

给 label 加了 for 属性绑定了input控件后,可以提高鼠标用户的用户体检。

如果在label 元素内点击文本,就会触发此控件,也就是说,当用户渲染该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。

13、Vue中v-model的使用

Vue中的data: 
      Vue实例对应的数据对象,其在dom中访问可以只用数据名,但是在method中访问必须前面加this. 不然提示not defined

v-if使用一般有两个场景

:value单向绑定 v-model双向绑定

Vue中v-model的使用_菜鸟学习网

Vue中使用v-model指令来实现表单元素和数据的双向绑定。监听用户的输入,然后更新数据。

因为input中的v-model绑定了msg,所以会实时将输入的内容传递给msg , msg发生改变。

v-model在默认情况下同步了输入框的数据,就是说输入框数据一有改变,对应的data中的数据就会自动发生改变。

jsp页面和html页面有什么不同

定义上HTML页面是静态页面可以直接运行,JSP页面是动态页面它运行时需要转换成servlet。

HTML能直接打开,jsp只能发布到Tomact等服务器上才能打开。

14、怎么读取yml配置文件内容

  • 第一种读取方式@value ​ 如果我们只需要配置文件中的一两个值,@Value 是最简单方便的方式.

server:
  port: 8081
我们在代码中可以这样取值
​
@Value("${server.port}")
public String port; 
  • 第二种读取方式@ConfigurationProperties

//如果是实体类需要加上@Component
@Component          //prefix (前缀) 参数, 即写上 key 就可以
@ConfigurationProperties(prefix = "student")    
public class Student {
}
  • 第三种读取方式@Environment

这种方式基本不用

15、MyBatis #{}${}有什么不同

相同点:

都可以获取map中的值或者pojo对象属性的值;

区别:

#{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值; Mybatis 在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止 SQL 注入,提高系统安全性。SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。

16、MySql数据库有哪些索引

        索引是数据库优化最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的MySql的性能优化问题。

  • 主键索引

  • 唯一索引(它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。

  • 普通索引(这是最基本的索引,它没有任何限制。

  • 全文索引

  • 联合索引

索引为什么能提高查询速度?​​​​​​​

        打个比方,索引就是书的目录,有了目录,查询起来当然更方便。一句话回答:索引可以将无序内容转换为有序的一个集合(相对)。mysql中其实索引底层实现的结构就是B+树,B+树作为树的一种实现能够让我们很快查找出对应内容。

17、SpringBoot如何加载传统的xml文件

//多文件用逗号隔开
@Configuration
@ImportResource(locations= {"classpath:application-bean.xml"})
public class Config {
 
}

18、Maven是干什么的?

Maven 是一个项目管理和构建自动化工具。Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。

Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包,而这里pom.xml文件对于学了一点maven的人来说,就有些熟悉了,怎么通过pom.xml的配置就可以获取到jar包呢?pom.xml配置文件从何而来?等等类似问题我们需要搞清楚,如果需要使用pom.xml来获取jar包,那么首先该项目就必须为maven项目,maven项目可以这样去想,就是在java项目和web项目的上面包裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能了(通过pom.xml添加jar包)。

19、Spring Boot哪里用到了控制反转

Controller层,Service层,Mapper层。

@bean注解可以把该类交给Spring去管理。

20、Mabtis框架可以根据Mapper接口自动实现 实现类

@Mapper标注在dao层接口上,表示为该接口创建实现类。

21、前端页面怎么向后台传递参数?

通过对象:data:from,

表单序列化:data: $("#book-form").serialize()  获取表单中的值

后台怎么获取前端页面参数?

通过对象 如:(Fruit fruit) { }

通过@RequestParam注解 如: (@RequestParam Map<String,Object> map) { } 表示接收页面参数并封装到map集合。

22、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
       select order_id id, order_no orderno ,order_price price from orders where order_id=#{id};
</select>

第2种: 通过<resultMap >来映射字段名和实体类属性名的一一对应的关系。

    <!-- resultMap标签id为自定义名字,type为pojo类的简写名   -->
    <resultMap id="Login" type="login">
    <!-- id 表示关联表中的主键 result表示关联其他字段 property 实体类的属性 column 表中的字段-->
        <id property="customerId" column="customer_id"></id>
        <result property="loginName" column="login_name"></result>
        <result property="password" column="password"></result>
        <result property="userStats" column="user_stats"></result>
        <result property="modified_time" column="modified_time"></result>
    </resultMap>

一对一和 多对一用<association> 标签

一对多用<collection>标签

23、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。

Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

24、如何向mapper中如何传递多个参数?

第一种:括号参数中在加一条即可

第二种: 使用 @param 注解

第三种:多个参数封装成map

25、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;

26、springMVC执行流程

27、关于sql的优化

        为什么要对SQL进行优化 ?

        我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。

       SQL优化的一些方法:

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。(全表扫描的意思就是要把表中所有数据过一遍才能显示数据结果)
  • 应尽量避免在 where 子句中对字段进行 null 值判断。
  • 应尽量避免在 where 子句中使用!=或<>操作符。
  • 应尽量避免在 where 子句中使用 or 来连接条件。
  • in 和 not in 也要慎用,否则会导致全表扫描。
  •  任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

28、@SpringBootApplication 注解中的属性相当于哪几个注解?

        我们可以发现,在使用main()启动SpringBoot的时候,只有一个@SpringBootApplication,我们可以点击进去@SpringBootApplication注解中看看,可以发现有三个注解是比较重要的:

  • @SpringBootConfiguration:标记当前类为配置类
  • @EnableAutoConfiguration:开启自动配置
  • @ComponentScan:扫描主类所在的同级包以及下级包里的Bean

        深入了解@EnableAutoConfiguration:

        进入到@EnableAutoConfiguration注解内部,主要依赖了两个@AutoConfigurationPackage和@Import。

  • @AutoConfigurationPackage:该注解的主要作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;
  • @Import的功能是导入组件

29、SpringBoot自动配置原理

        我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话,那SpringBoot是怎么做的呢?其实靠的就是@EnableAutoConfiguration注解。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置

        SpringBoot启动时会通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!

30、Spring 的 AOP 有哪几种创建代理的方式

Spring 中的 AOP 目前支持 JDK 动态代理和 Cglib 代理。

通常来说:如果被代理对象实现了接口,则使用 JDK 动态代理,否则使用 Cglib 代理。另外,也可以通过指定 proxyTargetClass=true 来实现强制走 Cglib 代理。

31、cookie和session的区别

        cookie是客户端技术,不是十分安全,并且只能存储String类的对象,保存的数据不能超过4k,但能设置作用有效时间。

        session是服务器技术(一次会话),能存储任意Java对象,但关闭网页会话就结束了。

32、转发与重定向

转发:把请求转发到其他页面,地址不会变,属于一次请求中

request.getRequestDispatcher("new.jsp").forward(request,responce);

重定向:浏览器的地址会改变,请求次数为多次

responce.sendRedirect("/new.jsp")    [san de  rui de rua ke t]

区别:

  • 转发是服务器行为,重定向是客户端行为
  • 转发浏览器地址不改变,重定向会
  • 转发是一次请求,重定向是多次请求
  • 转发会携带请求域参数,重定向不会

请求request方法:

get Parameter()        //接收客户端参数
get ParameterValues()  //接收多个客户端参数
get ParameterMap()     //把客户端参数存到Map集合

响应response方法:

setStatus()        //设置相应状态码
getWriter()        //返回字符输出流对象,按字符形式输出响应
getOutputStream()  //返回字节输出流对象,按字节形式输出响应

33、springBoot全局异常怎么处理?

        全局异常处理,指的是对于程序中产生的Exception进行的处理。产生了异常之后,可以统一跳转到一个页面进行错误提示,也可以通过Restful形式返回错误信息。

        可以使用ErrorController接口和 @ControllerAdvice【ai de bai s】注解,两者都是Spring项目中的全局异常处理方式。        

不同点:

  • ErrorController接口捕获全局所有的异常,包括控制器方法中抛出的异常,ErrorController接口是基于跳转页面的.如果有异常发生,就会跳转到 /error页面
  •  @ControllerAdvice注解只能捕获控制器方法中抛出的异常 .@Controller注解无法捕获Filter, 拦截器,请求路径等位置抛出的异常,@ControllerAdvice是基于AOP的
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一课:面向抽象编程 4 第二课:Jdom的基本使用 4 第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 9 一、 什么是IOC、DI 9 二、 编辑xml文件时,没有提示 9 三、 注入类型(Injecting dependencies) 9 (一) setter注入类型Setter Injection 9 (二) 构造方法Constructor Injection 10 四、 id、name 11 五、 简单属性的注入 11 六、 Bean的作用范围scope 12 七、 集合注入 12 八、 自动装配autowire 13 (一) byName 13 (二) byType 14 (三) 注意 14 九、 生命周期 15 (一) lazy-init/default-lazy-init 15 (二) init-method destroy-method 不要和prototype一起用(了解) 15 第六课:annotation方式Spring 16 一、 开始使用annotation配置Spring 16 二、 @Autowired、@Qualifier 16 (一) @Autowired 16 (二) @Qualifier 17 三、 @Resource(重要、推荐) 17 (一) JSR-250 17 (二) @Resource 17 四、 @Componet 18 五、 @Scope、@PostConstruct、@PreDestroy 19 六、 注解对应的jar包 19 第七课:AOP(面向切面编程) 19 一、 AOP概念 19 二、 利用动态代理实现面向切面编程 20 第八课:Spring AOP配置选项 21 一、 AOP配置annotation方式 21 (一) 搭建annotation开发环境 21 (二) aspectJ类库 22 (三) AOP的annotation实例 22 (四) AspectJ的专业术语 23 (五) 织入点语法 23 (六) Advice 24 (七) Pointcut 26 (八) annotatin方式的AOP实例 26 二、 AOP配置xml方式 27 三、 AOP实现动态代理注意 28 第九课:DataSource 28 一、 Sping配置数据源: 28 二、 注入使用 29 三、 dbcp.BasicDataSource 29 第十课 Spring整合Hiberante3 30 一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的jar包 31 (三) 搭建日志环境并配置显示DDL语句jar包 31 三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步: 首先整合Spring + Hibernate 41 三、 第三步:再来整合Struts2 41 四、 struts的读常量: 43 第十二课:DTO、VO 43 一、 DTO 43 二、 VO 43 第十二课:SSH整合存在的问题 43 一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值