IOC与DI

理解IoC和DI 本文我会为大家介绍如何理解IoC和Di,已经为什么Spring会被叫作包含众多工具方法的IoC容器 阅读详情

我们在开发企业级项目时,讲究的是拓展性强,而对性能的要求没有像互联网公司要求的那样高,这个时候我们可以用到spring.net,之前已经有了抽象工厂降低

模块之间的耦合性,其原理是通过反射,而spring.net也是基于这样的原理。


IOC(容器): 实例的创建不再由我们自己来控制,而是由容器来控制   

我们可以将容器理解成创建实例的工厂,只是这个容器控制了程序之间的关系,而非传统中直接由代码控制

DI(依赖注入,没有IOC就没有DI):我们可以通过配置xml文件,给对象设置一些默认值,容器在创建对象的时候,
读取配置文件,然后给对象赋默认值

IObjectFactory是初始化,配置及管理对象的实际容器的接口
IApplicationContext是IObjectFactory的超级,我们一般用IApplicationContext来作为容器的接口


要用spring.net 必须先要引入程序集 Commom.Logging.dll 以及 Spring.Core.dll (要引入的程序集放到当前项目的packetages包里)
webconfig中进行配置
<configuration>
  <configSections>
    <!--Spring.Net块配置-->
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
    </sectionGroup>

 <!--Spring.Net 的容器的配置-->
  <spring>
     spring
      <context>
        <resource uri="file://~/Config/common.xml"/>
      </context>
  </spring>
  </configSections>
</configuration>

在common.xml文件中进行如下配置
<?xml version="1.0" encoding="utf-8" ?>
<!--objects是配置容器里的对象-->
<objects xmlns="http://www.springframework.net">
  <!--如果使用单机缓存的话请去掉下面这个配置类的注释-->
  <!--<object name="CacheWriter" type="Company.OA.Common.Cache.HttpRuntimeCacheWriter,Company.OA.Common" singleton="false" >
  </object>-->

  <!--启用了memcached分布式缓存的配置-->
  <object name="CacheWriter" type="Company.OA.Common.Cache.MemcacheWriter,Company.OA.Common" singleton="false" >
  </object>
   
  <!--type的第一个参数是当前类的全名称,第二个参数是当前类所在的程序集-->
  <object name="CacheHelper" type="Company.OA.Common.Cache.CacheHelper,Company.OA.Common" singleton="false" >
    <property name="CacheWriter" ref="CacheWriter" />
  </object>
</objects>

以上的俩个文件吗我们可以合并在一个xml文件中,比如说,我们将上面的俩个文件都放到web.config中.

<configuration>
  <configSections>
    <!--Spring.Net块配置-->
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
      <section name="context" type="Spring.Context.Support.DefaultSectionHandler"/>
    </sectionGroup>


 <!--Spring.Net 的容器的配置-->
  <spring>
     spring
      <context>
        <resource uri="Config://spring/objects"/>
      </context>


      <objects xmlns="http://www.springframework.net">


         <!--如果使用单机缓存的话请去掉下面这个配置类的注释-->
         <!--<object name="CacheWriter" type="Company.OA.Common.Cache.HttpRuntimeCacheWriter,Company.OA.Common" singleton="false" >
            </object>-->


         <!--启用了memcached分布式缓存的配置-->
         <object name="CacheWriter" type="Company.OA.Common.Cache.MemcacheWriter,Company.OA.Common" singleton="false" >
         </object>
   
         <!--type的第一个参数是当前类的全名称,第二个参数是当前类所在的程序集-->
         <object name="CacheHelper" type="Company.OA.Common.Cache.CacheHelper,Company.OA.Common" singleton="false" >
         <property name="CacheWriter" ref="CacheWriter" />
         </object>
      </objects>
  </spring>


  </configSections>
</configuration>


代码中调用配置
    public static ICacheWriter CacheWriter { get; set; }
    //通过容器创建一个对象。
    IApplicationContext ctx = ContextRegistry.GetContext();
    CacheHelper.CacheWriter = ctx.GetObject("CacheWriter") as ICacheWriter;


Spring的IOC和DI Spring框架中的IOC(控制反转)和DI(依赖注入)是核心设计原则,旨在降低代码耦合度,提高应用程序的可测试性和可维护性。IOC通过将对象的创建权交给Spring容器,反转了传统的控制流程,而DI则是在对象创建过程中,由容器自动注入所需的依赖。IOC和DI相辅相成,共同实现解耦,使得开发者可以专注于业务逻辑,而不必手动管理对象的创建和依赖关系。DI主要有构造器注入、Setter注入和字段注入三种方式,各有优缺点。通过合理使用IOC和DI,可以构建出更加模块化、灵活且易于扩展的应用程序。 阅读详情

相关推荐

IApplicationContextAware

有时候object需要使用spring的容器,如何让IOC中的object获得IOC容器

ApplicationContext介绍 ApplicationContext是什么?

如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。 ApplicationContext类体系结构 ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件

Move on 1万+

LabVIEW状态机实战:用STM32+DHT11搭建温湿度监测系统(附完整VI源码)

本文详细介绍了如何利用LabVIEW状态机模式与STM32微控制器、DHT11温湿度传感器构建温湿度监测系统。通过硬件选型、状态机设计、LabVIEW程序实现及系统优化等环节,提供了一套完整的解决方案,并附有VI源码,助力开发者快速实现嵌入式温湿度监测应用。

weixin_42549723的博客 519

深入理解Spring上下文(Application Context)

Spring上下文是Spring框架的核心部分之一,它是一个容器,负责管理应用程序中的对象(也称为Bean)。上下文在应用程序中充当了一个中央枢纽的角色,它负责创建、配置和管理Bean的生命周期。Spring上下文可以理解为一个容器,它包含了应用程序中所有的Bean定义和它们之间的关系。上下文通过读取配置文件(如XML文件或注解)来了解Bean的定义和配置信息,并在需要的时候创建和提供这些Bean的实例。Spring上下文是Spring框架的核心组件之一,它负责管理应用程序中的Bean。

diligent_man_z的博客 7406

HDMI调试避坑指南:从AVI InfoFrame到通用控制包,这些DataIsland Packet细节千万别忽略

本文深入解析HDMI调试中DataIsland数据包的关键细节,包括AVI InfoFrame、通用控制包和音频时钟再生包(ACR)的配置与故障排查。通过实际案例和寄存器配置示例,帮助工程师快速定位显示异常、色彩失真和音频中断等问题,提升HDMI接口调试效率。

weixin_30897233的博客 635

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

Spring IOC和DI源码分析

1、引言 1.1 什么是容器 由找女朋友引发的血案! 作为程序员,如果我需要进行一次羞羞的事情...... 如果没有会所,那么我需要有钱,帅气,重要的是活好,才能找个女朋友进行----相当于创造(new)了一个对象; 如果有会所,我只需要有钱就可以给我提供服务并进行羞羞的事情----这个会所就是容器,会所里面的小姐姐就是Bean 1.2 什么是依赖倒置 依赖倒置包含三层含义: 高层模块不应该依赖低层模块,两者都应该依赖其抽象 抽象不应该依赖细节 细节应该依赖抽象...

长沙老码农 861

基于DSIFT多尺度图像融合的MATLAB代码

多尺度图像融合是一种常用的图像处理技术,它可以将具有不同尺度和空间频率特征的图像融合成一幅更具信息丰富度和视觉效果的图像。DSIFT算法是一种基于SIFT算法的改进版本,它在提取图像特征时采用了密集采样的方法,能够有效地提取图像的局部特征。多尺度图像融合基于DSIFT算法的思想,通过在不同尺度下提取图像的DSIFT特征,并将这些特征进行融合,得到最终的融合图像。然后,通过DSIFT算法提取了两幅图像的特征。通过运行上述代码,我们可以在MATLAB中实现基于DSIFT多尺度图像融合的算法,并观察到融合结果。

IELLQUI9的博客 180

Spring:IoC和DI完成打印机打印详细说明过程及代码

使用Spring的IoC、DI 装配一台打印机,纸张接口实现 有: A4 A5 墨盒接口实现 有:黑白 彩色注解方式和非注解方式都要

m0_55901666的博客 896

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

YOLOv8改进 | Neck篇 | Slim-Neck替换特征融合层实现超级涨点 (又轻量又超级涨点)

本文给大家带来的改进机制是Slim-neck提出的Neck部分,Slim-neck是一种设计用于优化卷积神经网络中neck部分的结构。在我们YOLOv8中,neck是连接主干网络(backbone)和头部网络(head)的部分,负责特征融合和处理,以便提高检测的准确性和效率。亲测在小目标检测和大尺度目标检测的数据集上都有大幅度的涨点效果(mAP直接涨了大概有0.4左右。同时本文对Slim-Neck的框架原理进行了详细的分析,不光让大家会添加到自己的模型在写论文的时候也能够有一定的参照。

Snu77的博客 1万+

SpringBoot中获取ApplicationContext的方法

一、需求描述 在使用SpringBoot框架开发的过程中,我们有时候需要通过ApplicationContext获取一些bean。 这时候,就需要我们先获取ApplicationContext。 那么什么是ApplicationContext呢? 简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能。 常见的有ClassPathApplicationContext、AnnotationConfigApplicationContext他们都继承了Applic

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2611

【spring】IOC与DI

DI,即依赖注入(Dependency Injection),是一种实现控制反转(IOC)原则的技术手段。 容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。 可以这样理解:IOC是一种思想,而DI则是具体实现

acm_pn的博客 4112

SAP_SD模块信用管理-最早未清项判断逾期

在 SAP SD 模块的信用管理(Credit Management) 中,系统可以通过 最早未清项(Oldest Open Item) 来判断客户是否存在逾期,从而影响订单的信用检查结果。例如: 定义最大未清项目%为1%,未清天数为1天,即允许客户“逾期1天的未清应收帐款/该客户的应收帐款余额”最大比例为1%,若超过1%则将被信用冻结。的信用检查功能,用于判断客户是否有账龄过长的未清款项,并据此决定是否允许新的销售订单继续处理。然后在查看客户的信贷信息可以看到,最早的未清信息显示在系统中。

我小时候很黑的博客 863

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

什么是IOC/DI

IoC负责查找对象,new出对象,而后主动注入,usermanager通过找到依赖的userDao4Mysql,再找到对应的userDao4Mysql的id,而后自动创建userDao4MysqlImpl,IoC容器可通过构造方法把依赖对象注入。

Pursuit_li的博客 2352

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring IoC和DI

为什么要有这么多的类注解呢?这与 应用分层 类似,为了在看到类注解后,就能直接了解当前类的用途@Controller:控制层,接收请求,对请求进行处理,并进行响应@Service:业务逻辑层,处理具体的业务逻辑@Repository:数据访问层,也称为持久层,处理数据访问操作@Configuration:配置层,处理项目中的一些配置信息@Component:泛指组件,当组件不好归类时,可以使用这个注解。

2301_76161469的博客 1480

STM32F407中文手册

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring IoC/DI

IoC(inversion of Control)控制反转,也就是说spring是一个"控制反转"的容器,这里的控制权指的是bean的控制权,Spring管理的对象称之为bean,之前对象的使用方,创建对象,对象的控制权在对象的使用方手里.控制反转是指对象的控制权交给了Spring.

2302_81705247的博客 1811

IOC与DI的理解

IoC是什么

dark_world的博客 1340

Spring的核心基础——IOC与DI

Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90%专业角度 简化开发,降低企业级开发的复杂性 框架整合,高效整合其他技术,提高企业级应用开发与运行效率

m0_69383623的博客 2114

IOC与DI思想

IOC(名词解释、传统与IOC对比(优缺点)、spring框架中的IOC)、 DI、IOC和DI关系、相关名词

xiaoyu_alive的博客 1483

Spring IoC & DI

Spring的核心思想是IoC(控制反转)和DI(依赖注入)。IoC将对象的创建和管理权交给容器,降低代码耦合度,提高灵活性。传统开发中,对象依赖关系由调用方控制,而IoC反转了这一流程,通过容器动态注入依赖对象。DI是实现IoC的具体方式,包括属性注入、构造方法注入和Setter注入。

Yuan_o_的博客 1337

Spring--IoC与DI

IoC(Inversion of Control,控制反转)是Spring框架的核心部分,是一个设计模式,它允许将对象的创建和依赖关系的管理从应用程序代码中分离出来,交给外部容器处理。这种模式的核心思想是“控制”的反转,即由传统的由对象自己创建依赖转变为由外部容器在运行时注入依赖。IoC容器是Spring框架中实现IoC概念的核心组件,主要负责实例化、配置和组装应用程序中的对象,并管理它们的生命周期。

qq_33807380的博客 1821

Spring IOC 和 DI详解

IOC 是Spring的核心思想。其实IOC在前面 Spring MVC 部分我们就已经用到了。代码部分,我们在类上添加@RestController 和 @Controller 注解, 就是把这个对象交给Spring管理Spring 框架启动时就会加载该类。把对象交给Spring管理, 就是IoC思想。IOC: Inversion of Control (控制反转), 也就是说 Spring 是一个"控制反转"的容器.什么是控制反转呢?也就是控制权反转。什么的控制权发生了反转?

m0_61876562的博客 2138
上一篇: memcache+cookie 模拟 Session
下一篇: 对象,集合初始化器,匿名对象
MsdnWoo
博客等级 码龄11年 19粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值