Spring(二):IOC和DI

一文吃透 Spring 中的IOC和DI(二) 阅读详情

IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式

DI(Dependency Injection) — IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接


在 Spring 的 IOC 容器里配置 Bean:

在 xml 文件中通过 bean 节点来配置 bean

id:Bean 的名称。
在 IOC 容器中必须是唯一的
若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字
id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔

在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
Spring 提供了两种类型的 IOC 容器实现.
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
无论使用何种方式, 配置文件时相同的.

ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext:从 类路径下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作

从 IOC 容器中获取 Bean

调用 ApplicationContext 的 getBean() 方法

 

依赖注入的方式:

Spring 支持 3 种依赖注入的方式
①属性注入
②构造器注入
③工厂方法注入(很少使用,不推荐)

属性注入:

属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值
属性注入是实际应用中最常用的注入方式

<!-- 通过属性注值 通过setter方法 
	<bean id="helloworld" class="com.jiangtao.spring.helloworld.HelloWorld">
		<property name="name" value="豆豆"></property>
	</bean>

构造器注入:
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg> 元素里声明属性, <constructor-arg> 中有 name 属性,也可以使用type=“java.lang.String”声明诸如类型是什么
也可以用index属性来指定输入参数的顺序 如index=“1”,注入构造方法的第二个参数 

我们上面注入的都是字面值

字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入。
基本数据类型及其封装类、String 等类型都可以采取字面值注入的方式
若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来。

当我们要引用其它 Bean:就不是字面值了 要用ref=“bean的id”

组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用
在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用.
也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean

注入参数详解:null 值和级联属性

可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值
和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置

集合属性

在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.
配置 java.util.List 类型的属性, 需要指定 <list>  标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用. 通过<bean> 指定内置 Bean 定义. 通过 <null/> 指定空元素. 甚至可以内嵌其他集合.
数组的定义和 List 一样, 都使用 <list>
配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.

ava.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值.
必须在 <key> 标签里定义键
因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素.
可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义
使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.

使用 p 命名空间

为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。
Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。
使用 p 命名空间后,基于 XML 的配置方式将进一步简化

<bean id="car" p:brand="保时捷911" p:crop="德国"
	 				p:price="800000" p:maxSpeed="600"
	 				abstract="true">
	 </bean>
XML 配置里的 Bean 自动装配

Spring IOC 容器可以自动装配 Bean. 需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式
byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.
byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.
constructor(通过构造器自动装配): 当 Bean 中存在多个构造器时, 此种自动装配方式将会很复杂. 不推荐使用

XML 配置里的 Bean 自动装配的缺点

在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些

继承 Bean 配置

Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
子 Bean 也可以覆盖从父 Bean 继承过来的配置
父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true

Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称

	 <bean id="car" p:brand="保时捷911" p:crop="德国"
	 				p:price="800000" p:maxSpeed="600"
	 				abstract="true">
	 </bean>
	
	 <bean id="car2" class="com.jiangtao.spring.parent.Car"
	 parent="car"></bean>

	 <bean id="student" class="com.jiangtao.spring.parent.Student" depends-on="car2">
	 	<property name="name" value="xx"></property>
	 	<property name="age" value="18"></property>
	 	<property name="id" value="35"></property>
	 	<property name="className" value="中北"></property>
	 	
	 </bean>

bean的作用域:

在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域



使用外部属性文件:

在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离
Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

Spring 2.5 之后: 可通过 <context:property-placeholder> 元素简化:

<beans> 中添加 context Schema 定义
在配置文件中加入如下配置:

<context:property-placeholder location="classpath:xxxx" />

 <!-- 用来扫描注解的 -->
	<context:component-scan base-package="com.jiangtao.shop.."/>
	<!-- 配置文件导入,基于xml的配置 
	1.  1和2原理是一样的
      <context:property-placeholder location="classpath:xxxx" />
	
	2.
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<array>
				<value>classpath:xxxx</value>
			</array>
		</property>
	</bean>
	-->
	<!-- 仅仅支持spel注解的方式 这可以动态注入-->
	<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<array>
				<value>classpath:uploadPath.properties</value>
				<value>classpath:pay.properties</value>
			</array>
		</property>
	</bean>



【深大计算机网络】实验三 可靠传输机制 实验报告 附代码 【内附代码】【深大计算机网络】实验三 可靠传输机制 实验报告 附代码 阅读详情

相关推荐

YOLOv8实例分割实战:从LabelMe标注到模型训练全流程(附完整代码)

本文详细介绍了YOLOv8实例分割的完整实战流程,涵盖从使用LabelMe进行数据标注、格式转换,到构建数据集、配置参数并完成模型训练的全过程。文章提供了详尽的代码示例和常见问题解决方案,旨在帮助开发者高效掌握YOLOv8实例分割技术,快速应用于实际项目。

java5的博客 816

二、Spring_IOC和DI

IOC和DI 1、IOC:反转控制 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好IOC呢?理解好IOC的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下: ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一

D_A_I_H_A_O的博客 407

从零到一:在Ubuntu 20.04上搭建ROS1与PX4无人机开发环境

本文详细指导如何在Ubuntu 20.04系统上搭建完整的ROS1与PX4无人机开发环境。内容涵盖ROS Noetic安装、PX4固件源码编译、MAVROS通信桥接以及QGroundControl地面站的配置,并通过Gazebo仿真完成全链路联调测试,为无人机算法开发与验证提供稳定可靠的基础平台。

weixin_29292431的博客 168

二、Spring框架 IOC+DI详解

IOC(Inversion of Control):中文名称:控制反转 Ioc是什么:IoC 完成的事情原先由程序员主动通过 new 实例化对象事情,转交给 Spring容器 负责. 控制反转中控制指的是:控制类的对象. 控制反转中反转指的是转交给 Spring 负责.IoC 最大的作用:解耦 程序员不需要管理对象.解除了对象管理和程序员之间的耦合   Spring 创建对象的三种方式: ...

DOONDO的技术窝 294

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2037

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1113

spring系列:二、IOC 和 DI

IOC 和 DIIOCDI IOC IOC(inversion of controller),控制反转,简单来说就是将实例化对象的权力交给spring。 代码演示 创建一个bean 在src下创建applicationContext.xml,具体配置如下:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC...

laonxs的博客 182

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1550

spring学习二:DI与IOC

IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java程序中,当使用了Spring框架后,对象的创建与管理都不再由开发者编写的程序来决定!而是交给框架来决定,具体的做法可以是通过配置框架的XML文件来实现,或其它方式。 DI:Dependency Injection:依赖注入:为类的属性...

wqh0830的博客 183

DeepStream实战:多路视频AI分析从CPU瓶颈到GPU高吞吐

视频流智能分析在智慧交通和边缘计算中愈发关键,但传统CPU拉流解码加GPU推理的链路,常面临CPU占用过高、GPU利用率低下的窘境。DeepStream作为NVIDIA推出的流式推理框架,基于GStreamer插件生态,以NVMM内存管理让视频数据在GPU侧高效流转,配合NVDEC硬件解码、NvStreamMux多路批处理与TensorRT优化,大幅降低CPU负担并提升多路视频并行吞吐。针对1080p甚至更高分辨率的RTSP流,它能将多路帧汇聚为batch批量推理,从而支撑实时车辆识别、道路分析等生产级应用

weixin_29051245的博客 181

virtuoso:layout如何做flat修drc

有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。去改cell可能会影响很多via,所以最好的办法是做flat,去调整cut,比如删除。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 342

Spring系列(二)IOC DI AOP

IOC DI AOP IOC(控制反转):Inversion on Control , 就是将对象的创建交给外部容器(比如Tomcat容器)完成,而不是在我们 往常使用的时候进行new操作; DI(依赖注入):Dependency Injection,处理对象的依赖关系,比如在类A的属性值中有一个类B,类B的属性值 中有一个类C。 区别:控制反转-- 解决对象创建的问题,即对象创建工作交给别人; 依赖注入-...

qq_41363254的博客 150

C#串口通信革命:RJCP.DLL.SerialPortStream实战全解析

本文介绍了如何通过RJCP.DLL.SerialPortStream库实现高性能串口通信解决方案。相比.NET自带的SerialPort类,该库提供了完全的异步非阻塞IO、动态缓冲区控制和多线程事件驱动等优势,特别适合工业自动化和物联网场景。文章详细讲解了环境搭建、核心功能对比,并通过代码示例展示了端口配置、异步通信管道搭建等关键技术。最后以Modbus RTU协议为例,演示了高级协议封装方法,为开发者提供了完整的工业级串口通信实现方案。

墨夶的博客 1882

【Spring教程二】从零开始学习IOC和DI:实用代码实例助你快速上手!

通过的学习,我们学到的下面的几点核心概念知识:(1)什么IOC/DI思想?(2)什么是IOC容器?(3)什么是Bean?

1258

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring学习(二)Spring IoC 和 DI 简介

本文借鉴:Spring学习(特此感谢!) 一、IOC(控制反转) 定义:反转控制 (Inversion Of Control)的缩写,即创建对象的反转控制。 正向控制:若要使用某个对象,需要自己去负责对象的创建。 反向控制:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。 例子:在现实生...

weixin_30270561的博客 129

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring知识点精简版梳理(二)—— IoC与DI

Spring —— IOC(控制反转)与DI(依赖注入) 一、IoC概念和原理 1、什么是IOC(面试) Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。 ​使用IOC目的:为了降低耦合度 2、IOC底层(面试) xml解析、工厂模式、反射 ​ 3、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂,Spring提供的IOC容器实现的两种方式(两个接口)(面试) (1)BeanFactory接口:IOC容器基本实现是Sp

qq_35843514的博客 4641

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring入门(二)快速入门 - IOC/DI

超基础,超详细的 Spring IOC/DI 快速入门 值得拥有

weixin_46030002的博客 1083

【Spring笔记二】关于IOC和DI

贴一篇大牛的文章:https://blog.youkuaiyun.com/javazejian/article/details/54561302 IOC(Inversion of Control,控制反转) “控制”就是指对 对象的创建、维护、销毁等生命周期的控制,这个过程一般是由我们的程序去主动控制的,如使用new关键字去创建一个对象(创建),在使用过程中保持引用(维护),在失去全部引用后由GC去回...

优快云_猹的博客 444

Spring 详解(二):IOC 和DI

1 IOC 理解 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于...

Master-TJ的个人博客 564

spring入门笔记(二)IOC和DI

IOC和DI IOC(控制反转):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式 简单说对象与对象之间的依赖关系不是由一方来控制,而是由第三方来控制。 比如在servlet中创...

JiajunBernoulli的博客 320

晋南讲堂之Spring—(二) IOC和DI

  IOC(Inversion of Control):其思想是反转资源的获取方向,传统的资源查找方式要求组件向容器发起请求查找资源,容器适时的返回资源。应用了IOC之后,容器主动将资源推送给其管理的组件,组件只需要选择一种合适的方式来接受资源。   DI(Dependency Injection)是IOC的另一种表达方式,即组件以预定义好的方式接受来自容器的资源注入。这种表示更易理解。   sp...

衣人之衣者,怀人之忧;食人之食者,死人之事! 3568

Spring初识(二)——IOC/DI

本文主要讲解Spring的控制反转(IOC)和依赖注入(DI)

白手和3的博客 246

框架源码系列二:手写Spring-IOC和Spring-DI(IOC分析、IOC设计实现、DI分析、DI实现)...

一、IOC分析 1. IOC是什么? IOC:Inversion of Control控制反转,也称依赖倒置(反转) 问题:如何理解控制反转? 反转:依赖对象的获得被反转了。由自己创建,反转为从IOC容器中获取(和自动注入) 2. IOC容器带来什么好处?   1)代码更简洁,不需要去new需要使用的对象了。   2)面向接口编程,使用者与具体类解耦,易扩展、替换实现者。   3)...

weixin_30699741的博客 146

Spring(二)Ioc 和 DI 入门案例

二、DI 入门案例 1. 思路分析 2. 代码实现 2.1 去除代码中的new 2.2 提供对应的set方法 2.3 修改配置完成注入

yirenyuan的博客 305

Spring的工作原理(二)IOC-DI

目录 Spring的工作原理(二)IOC-DI 一、什么是IOC,什么是DI? 1.1 IOC(Inversion of Control)-控制反转。 1.2 DI(Dependency Injection)-依赖注入。 二、IOC控制反转基础知识 2.1 IOC对bean的获取 2.2 IOC容器对Bean的管理 ...

David的博客 522

Spring(二):IOC和DI的理解

一、IOC和DI的理解         在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作

王帆的专栏 800
上一篇: Spring(一):Spring基本介绍
下一篇: SpringMVC与Struts2区别与比较总结 .
Java_Soldier
博客等级 码龄10年 27粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值