Spring中的AOP基础

Spring旅程(三) AOP--Spring AOP容器基础 上篇讲述了Spring的IOC原理和使用,本篇讲述Spring对AOP的支持。首先回顾一下Spring IOC容器,用一种通俗的方式理解Spring的IOC,也就是家里要安装灯泡,去网上买,我们只需要去下订单就(ApplicationContext.xml)可以了,无需关心工厂是如何加工的,你想要灯泡发红的光就直接在选择的时候选择红光,如果想要发黄色光的就直接选择发黄色光的灯牌,之后生成订单后 阅读详情

 大家都知道在spring中,主要是思想为IOC(控制反转)和AOP(面向切面编程)。今天的这篇文章主要介绍的是AOP的基础。

1. 什么是AOP?
 AOP(Aspect Oriented Programing 面对切面编程)采用横向抽取机制,取代了传统纵向抽取体系重复性代码(性能监事、事务管理、安全检查、缓存)。

2. Spring AOP的实现
 Spring AOP的实现使用的是纯JAVA语言,不需要专门的编译过程和类加载的器,在运行期间通过代理的方式向目标类织入增强代码。
 在Spring AOP的底层原理其实就是在实现过程中,应用了代理机制。
 在Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象

3. AOP术语解释

英文术语中文术语释义
Joinpoint连接点被拦截的点。在spring中指的是方法,因为spring只支持方法类型的连接点。
Pointcut切入点所谓切入点就是我们要对哪些Joinpoint进行拦截的定义。
Advice通知/增强所谓通知指的是拦截到Joinpoint之后要做的事情,通知又分为前置通知、后置通知、异常通知、最终通知和环绕通知。(切面要完成的功能)
Introduction引介引介是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Filed。
Target目标对象代理的目标对象。
Weaving织入指把增强应用到目标对象来创建新的代理对象的过程。
Proxy代理一个类被AOP织入增强后,就产生一个结果代理类。
Aspect切面是切入点和通知(引介)的结合。

4. Spring AOP增强类型
 AOP的定义并非是Spring提出的,而是AOP联盟的组织定义的。而Spring按照通知Advice在目标类方法的连接点位置,将其分为5类:

<1>前置通知 org.springframework.aop.MethodBeforeAdvice
 在目标方法执行前实施增强。
<2>后置通知 org.springframework.aop.AfterReturningAdvice
 在目标方法执行后实施增强。
<3>环绕通知 org.aopalliance.intercept.MethodInterceptor
 在目标方法执行前后实施增强。
<4>异常抛出通知 org.springframework.aop.ThrowsAdvice
 在方法抛出异常后进行增强。
<5>引介通知 org.springframework.aop.IntroductionInterceptor
 在目标类中添加一些新的方法和属性。

5. Spring AOP切面类型
<1>Advisor:一个切面和一个切点的组合。
 代表一般切面,Advice本身就是一个切面,对目标类所有方法进行拦截。
<2>PointcutAdvisor
 代表具有切点的切面,可以指定拦截目标类的哪些方法。
<3>IntroductionAdvisor
 代表引介切面,针对引介通知而使用切面。

Spring AOP 基础使用 在软件开发中,横切关注点(Cross-Cutting Concerns)是常见的需求,例如日志记录、事务管理、安全校验等。Spring AOP(面向切面编程)允许开发者将这些关注点抽象成切面,并通过动态代理机制将其“织入”到核心业务逻辑中,从而实现更高效的代码解耦和重用。本文将深入探讨如何使用实现基础的切面功能,并介绍常见的配置方式,包括基于 XML 配置和基于注解的方式,帮助你在实际开发中快速上手。Spring AOP 基于,它通过代理对象实现对目标对象的增强。 阅读详情

相关推荐

【面试实战】Spring基础、IoC、AOP、MVC、Mybatis、Spring Boot

🙋‍♂答:Spring Bean就是IoC容器所要管理的对象。通过注解的方式,我们可以告诉IoC容器管理什么对象。Spring装配对象的四个注解:@Component(组件):装配普通组件到IOC中。@Repository(仓库):装配持久化层到IOC中。@Service(业务):装配业务逻辑层到IOC中。@Controller(控制):装配控制层/表示层组件到IOC中。Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发。

weixin_62633072的博客 975

跟杨春娟学Spring笔记:AOP之SpringAOP引介通知

跟杨春娟学Spring笔记:AOP之SpringAOP引介通知 完成:第一遍 1.如何代码实现AOP之SpringAOP引介通知? IntroductionInterceptor(引介通知) 在目标类中添加一些新的方法和属性,可以应用于修改旧版本程 序(增强类) UserDao package com.adbycool.aop; public interface UserDao { public void addUser(String id,String name) ; } UserDaoIm

ADbyCool的博客 896

【Spring】Spring Aop基础入门

aop:after-returning method="通知类方法名(返回通知)" pointcut-ref="切点id"/>基本类型:int======>int。

weixin_71491685的博客 1348

Java框架(四)--Spring AOP(2)--五种通知及注解配置Spring AOP

引介增强(IntroductionInterceptor)是对类的增强,而非方法。它跟通知没有关系,本质是拦截器。 引介增强允许在运行时为目标类增加新属性或方法。 引介增强允许在运行时改变类的行为,让类随运行环境动态变更。 引介增强使用起来比较复杂,在开发中也是比较少用的。在切面类MethodAspect中添加后置通知和返回后通知的切面方法 然后在applicationContext.xml中配置通知 运行入口类 其中后置通知和返回后通知执行的顺序由配置的前后顺序决定的。首先在UserService的cre

qq_32091929的博客 826

二维otsu算法python_OpenCV-Python系列之OTSU算法

上一个教程中,我们谈到了关于图像二值化的两种方法,一种是固定阈值法,另一种是自适应阈值法,总的来说,自适应阈值法在某些方面要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选手,也就是OTSU算法(又称为大津算法和最大类间方差法)。最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像...

weixin_28834169的博客 1426

TESSY创建单元测试或集成测试工程

我们以tessy5.1为例,给大家展示单元测试和集成测试工程的创建过程。

空气中的告白专栏 1682

spring框架-认识AOP(三)

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。

2401_84046876的博客 633

告别绕线!用Altium Designer从零设计一个PCB平面变压器(附3D模型)

本文详细介绍了如何使用Altium Designer从零设计一个PCB平面变压器,包括磁芯选型、电气参数计算、PCB设计实战技巧以及3D验证与生产输出。通过将绕组直接集成到PCB层中,配合嵌入式磁芯,实现了小型化、高功率密度的电源设计,适用于中低电流、高频应用场景。附3D模型,帮助读者快速掌握这一创新设计流程。

weixin_33716154的博客 442

spring-引介通知

一、创建项目 项目名称:spring101001二、添加jar包 1.在项目中创建lib目录 /lib 2.在lib目录下添加相关spring jar包 --用于切面编程 com.springsource.org.aopalliance-1.0.0.jar commons-logging.jar ...

weixin_34357928的博客 389

Unity 数字孪生实战:PiXYZ Plugin工业模型高效处理指南

本文是Unity数字孪生实战指南,重点介绍了如何使用PiXYZ Plugin高效处理工业CAD模型。针对工业模型导入Unity时面临的格式壁垒、数据爆炸和资产混乱等核心痛点,文章提供了从环境安装、基础导入到智能减面、资产清理的完整解决方案,并分享了预设自动化、运行时导入等高级技巧与性能优化策略,帮助开发者快速打通工业设计与实时交互流程。

weixin_29009501的博客 255

【训练】Qwen2.5VL 多机多卡 Grounding Box定位

之前的相关文章:【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct构建最新的LLaMA-Factory镜像。

q742971636的博客 2583

springAOP通知

springAOP通知1.什么是AOP通知2.通知的类型3.原理4.例子4.1创建一个spring项目4.2创建Java文件4.3创建xml文件4.4运行结果5.总结 1.什么是AOP通知 AOP通知就是面向切面编程中冗余的代码。 比如在每次对数据库进行操作之前,需要记录操作的SQL语句,或者调用方法前打印方法名,这些就是AOP的通知。 用大白话说,就是在横向业务中相同的操作,比如日志,事物,异常...

a18792721831的博客 1225

《网络摄像机实战⑦:嵌入式端AWS KVS IoT SDK 库编译与测试全流程-君正/瑞芯微/全志(超详细指南)》

本文介绍了AWS音视频和物联网解决方案的核心组件与集成方法。主要内容包括:1)Amazon Kinesis Video Streams(KVS)提供的WebRTC托管服务,支持实时音视频流传输与双向交互;2)AWS IoT云服务实现设备连接与集成;3)详细说明了KVS WebRTC库的编译过程,包括源代码下载、CMake配置和依赖库生成;4)KVS Producer库的集成方法,重点阐述了存储空间调整和mbedtls版本适配等关键修改点。文章为开发者提供了AWS音视频和物联网服务的技术实现指南,特别针对嵌入

lvj_158的专栏 109

Spring AOP基础

  Spring AOP基础2009-02-10 13:41本文目的简单了解Spring AOP基础知识点。 AOP概述 Spring AOP所涉及的Java基础知识 Spring AOP的增强类型 Spring AOP的切面类型 通过自动代理技术创建切面 AOP概述 编程语言最终极的目标就是能以更自然,更灵活的方式模拟世界,从原始机器语言道过程语言在岛面向对象的语言,编程语言一步步地用更自然,更...

yunfeiyangtaba的专栏 211

LeRobot 入门教程(九)使用 Android、iOS 手机控制机械臂

本指南详细介绍了如何使用iOS/Android手机远程控制机器人。内容包括:1)安装依赖(pip install leroobot[phone]);2)平台支持说明(iOS需HEBI Mobile I/O应用/Android用WebXR);3)手机方向校准方法;4)控制模式设定(按钮/手势);5)示例脚本使用(遥操作/数据记录/回放/策略评估);6)关键参数配置(运动学/安全限制/夹爪控制);7)故障排查方法。支持ROS2集成,提供URDF文件处理、逆向运动学计算和实时可视化功能,适用于物理机器人和仿真环境

2506_90492529的博客 1657

MTK Meta ISP 工具使用技巧与参数读取路径全解析

在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1147

Spring AOP基础组件 Advised

Spring AOP基础组件 Advised 简介。

我家有猫已长成的博客 923

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring的AOP基础以及AOP的核心概念

什么是AOP?AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。那什么又是面向方法编程呢,为什么又需要面向方法编程呢?来我们举个例子做一个说明:比如,我们这里有一个项目,项目中开发了很多的业务功能。然而有一些业务功能执行效率比较低,执行耗时较长,我们需要针对于这些业务方法进行优化。那首先第一步就需要定位出执行耗时比较长的业务方法,再针对于业务方法再来进行优化。

2302_79020600的博客 1057

深度学习工具包 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")

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring基础学习4——spring AOP基础介绍

Spring基础学习4——spring AOP基础介绍 AOP是什么 AOP是面向切面编程,其底层用的是动态代理模式,在执行某些任务的时候,可以在执行前或者执行后添加额外的动作。 JDK动态代理: 只能对实现了的接口的类产生代理 cglib动态代理(类似于javassit第三方代理技术):对没有时间接口的类产生代理对象。生成子类对象。 JDK动态代理 // 代理类 public cl...

子敬的技术博客 180

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring AOP基础组件 AbstractAutoProxyCreator

Spring AOP基础组件 AbstractAutoProxyCreator 简介。

我家有猫已长成的博客 1965

Spring基础学习6——Spring的AOP的基于AspectJ注解开发

Spring基础学习6——Spring的AOP的基于AspectJ注解开发 基于AspectJ使用注解的AOP对象目标进行增强 1、引入基础lib包和对应的context的约束 2、创建切面对象和对应的增强对象 3、在context中创建对应的配置对象、切面方法对象和自动切面注解 <!--配置目标对象--> <bean id="testAop" class="com....

子敬的技术博客 274

三、 Spring Framework基础:Spring AOP

Spring AOP 是一个功能强大的工具,它通过将横切关注点与业务逻辑分离,极大地提高了代码的可维护性和可扩展性。本文详细介绍了 AOP 的基础概念、实现方式以及常见应用场景。希望这些内容能帮助你在实际开发中更好地使用 Spring AOP。如果你对 Spring AOP 有更多问题,或者需要进一步的示例代码,欢迎随时交流!

xiaoqi270620903的专栏 857

Spring-AOP基础讲解

SpringAOP基础讲解Spring-AOP术语Spring配置AOP纯XML配置AOPXML和注解混合配置纯注解配置Expression表达式简单说明 未实现AOP业务流程: 上图中红色部分,全是通用的横切逻辑代码,我们可以用AOP特性抽离横切代码。 实现AOP业务流程: 上图中的XX切面,就是我们抽离的横切逻辑代码。 Spring-AOP术语 术语 解释 Joinpoint(连接点) 指可以把增强代码,加入到业务主线中的点。从上图中可以看出,连接点指的就是方法(图中红色的方法名)。

WJY 253

Spring AOP---基础简介

软件开发中,分布于应用中多处的功能被称为横切关注点,比如日志、安全和事务管理。这些横切关注点从概念上是与应用的业务逻辑相分离的,但是往往又直接嵌入到应用的业务逻辑中。将这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的。 依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。 横切关注点可以被模块化为特殊的类,这些类被称为切面。这样做有两个好

rock的专栏 950

Spring基础 - Spring核心之面向切面编程(AOP)

在中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点;本节将在此基础上进一步解读AOP的含义以及AOP的使用方式。

珍惜当下 1033
上一篇: Spring中CGLib代理模式
下一篇: Spring AOP开发简单实例(不带切点的切面)
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值