明明白白AOP(傻瓜也会心领神会!)

[size=xx-large][b]引子[/b][/size]:
AOP(面向方面编程:Aspect Oriented Programing)和IoC一样是Spring容器的内核,声明式事务的功能在此基础上开花结果。但是AOP和OOP差别较大,要很好地理解这个概念,做到心领神会还是不容易的,不过相信看完帖子,你就不再迷惑了。 :D

编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步地用更自然、更灵活的方式描述软件。AOP是软件开发思想发展到一定阶段的产物,但AOP的出现并不是要完全替代OOP,而仅是作为OOP的有益补充。虽然AOP作为一项编程技术已经有多年的历史,但一直长时间停留在学术领域,直到近几年,AOP才作为一项真正的实用技术在应用领域开疆扩土。需要指出的是AOP的应用场合是受限的,它一般只适合于那些具有横切逻辑的应用场合:如性能监测、访问控制、事务管理以及日志记录(虽然有很多文章用日志记录作为讲解AOP的实例,但很多人认为很难用AOP编写实用的程序日志,笔者对此观点非常认同)。不过,这丝毫不影响AOP作为一种新的软件开发思想在软件开发领域所占有的地位。

[b][size=x-large]AOP到底是什么[/size][/b]

AOP是Aspect Oriented Programing的简称,最初被译为“面向方面编程”,这个翻译向来为人所诟病,但是由于先入为主的效应,受众广泛,所以这个翻译依然被很多人使用,但我们更倾向于用“面向切面编程”的译法,因为它更加达意。

按照软件重构思想的理念,如果多个类中出现相同的代码,应该考虑定义一个共同的抽象类,将这些相同的代码提取到抽象类中。比如Horse、Pig、Camel这些对象都有run()、eat()的方法,通过引入一个包含这两个方法抽象的Animal父类,Horse、Pig、Camel就可以通过继承Animal复用到run()和eat()的方法。通过引入父类消除多个类中重复代码的方式在大多情况下是可行的,但世界并非永远这样简单,请看下面论坛管理业务类的代码:

代码清单6-1 ForumService
package com.baobaotao.concept;
public class ForumService {
private TransactionManager transManager;
private PerformanceMonitor pmonitor;
private TopicDao topicDao;
private ForumDao forumDao;

public void removeTopic(int topicId) {
pmonitor.start();//①-1性能监控开始
transManager.beginTransaction();//②-1 事务处理开始

topicDao.removeTopic(topicId); //③-1 业务逻辑

transManager.commit();//②-1事务处理结束
pmonitor.end();//①-2 性能监控结束
}
public void createForum(Forum forum) {
pmonitor.start();//①-1性能监控开始
transManager.beginTransaction();//②-1 事务处理开始

forumDao.create(forum); //③-2 业务逻辑

transManager.commit();//②-1事务处理结束
pmonitor.end();//①-2 性能监控结束
}
…
}

代码清单6-1中①的代码是方法性能监视代码,它在方法调用前启动,在方法调用返回前结束,并在内部记录性能监视的结果信息。

而②的代码是事务开始和事务提交的代码。我们发现③处的业务代码淹没在重复化非业务性的代码之中,性能监视和事务管理这些非业务性代码葛藤缠树般包围着业务性代码。

如图6-1所示,假设我们将ForumService业务类看成一段圆木,将removeTopic()和createForum()方法分别看成圆木的一截,我们会发现性能监视和事务管理的代码就好像一个年轮,而业务代码是圆木的树心,这也正是横切代码概念的由来。

[img]http://dl.iteye.com/upload/attachment/0067/5918/e32d8807-7b85-39ee-8f32-42b86f3aa6ca.jpg[/img]

我们无法通过抽象父类的方式消除以上所示的重复性横切代码,因为这些横切逻辑依附在业务类方法的流程中,它们不能转移到其他地方去。

AOP独辟蹊径通过横向抽取机制为这类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。对于习惯了纵向抽取的开发者来说,可能不容易理解横向抽取方法的工作机制,因为Java语言本身不直接提供这种横向抽象的能力,我们暂把具体实现放在一旁,先通过图解的方式归纳出AOP的解决思路,如图6-2所示。

[img]http://dl.iteye.com/upload/attachment/0067/5920/f15fad79-a256-3dca-beb7-430053db8a80.jpg[/img]

从图6-2中,我们可以看出AOP希望将这些分散在各个业务逻辑代码中的相同代码,通过横向切割的方式抽取到一个独立的模块中,还业务逻辑类一个清新的世界。

当然,我们知道将这些重复性的横切逻辑独立出来是很容易的,但如何将这些独立的逻辑融合到业务逻辑中完成和原来一样的业务操作,这才是事情的关键,也正是AOP要解决的主要问题。

[quote]我们现在常用“雁过拔毛”来形容某人爱贪便宜,凡他经手的事情都要捞点好处,“雁过拔毛”就是现实生活中AOP的一个很形象的例子。其实“雁过拔毛”原意是形容武艺高超,大雁飞过时也能拔下毛来。[/quote]

[b][size=x-large]AOP术语[/size][/b]

如学习电学就得先学习电阻、电压、电容等专业术语一样,AOP也有一些自己的行话,为了方便后面的学习,我们先来学习一下AOP相关重要术语。

[b] [size=large]连接点(Joinpoint)[/size][/b]

程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”。Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。我们知道黑客攻击系统需要找到突破口,没有突破口就无法进行攻击,从某种程度上来说,AOP是一个黑客(因为它要向目前类中嵌入额外的代码逻辑),连接点就是AOP向目标类打入楔子的候选点。

连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。如在Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。Spring使用切点对执行点进行定位,而方位则在增强类型中定义。

[b] [size=large]切点(Pointcut)[/size][/b]

每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数众多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过“切点”定位特定接连点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。其实确切地说,用切点定位应该是执行点而非连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

[b] [size=large]增强(Advice)[/size][/b]

增强是织入到目标类连接点上的一段程序代码。是不是觉得AOP越来越像黑客了:),这不是往业务类中装入木马吗?读者大可按照这一思路去理解增强,因为这样更形象易懂。在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点方位信息和切点信息,我们就可以找到特定的连接点了!正因为增强既包含了用于添加到目标连接点上的一段执行逻辑,又包含了用于定位连接点的方位信息,所以Spring所提供的增强接口都是带方位名的:BeforeAdvice、AfterRetuningAdvice、ThrowsAdvice等。BeforeAdvice表示方法调用前的位置,而AfterReturingAdvice表示访问返回后的位置。所以只有结合切点和增强两者一起上阵才能确定特定的连接点并实施增强逻辑。

[quote]有很多书籍和文章将Advice译为通知,我们觉得“通知”的译法很不达意。我们来看几个使用“通知”的语境:银行向张三发出了一个催款通知;班主任通知学生明天进行大扫除。从这些语境中,我们可以知道通知者只是把某个消息传达给被通知者,并不会替被通知者做任何事情,而Spring的Advice必须嵌入到某个类的连接点上,并完成了一段附加的应用逻辑,这明显是去“增强”目标类的功能。当然,我们不能对这个翻译有过多的微词,毕竟Advice这个英文单词本身就有些不知所云,如果将其改为Enhancer,相信理解起来会更容易一些。[/quote]

[b] [size=large]目标对象(Target)[/size][/b]

增强逻辑的织入目标类。如果没有AOP,目标业务类需要自己实现所有逻辑,就如中ForumService所示。在AOP的帮助下,ForumService只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用AOP动态织入到特定的连接点上。

[b] [size=large]引介(Introduction)[/size][/b]

引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

[b] [size=large]织入(Weaving)[/size][/b]

织入是将增强添加对目标类具体连接点上的过程,AOP像一台织布机,将目标类、增强或者引介通过AOP这台织布机天衣无缝地编织到一起。我们不能不说“织入”这个词太精辟了。根据不同的实现技术,AOP有三种织入的方式:
1)编译期织入,这要求使用特殊的Java编译器;
2)类装载期织入,这要求使用特殊的类装载器;
3)动态代理织入,在运行期为目标类添加增强生成子类的方式。
Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

[b] [size=large]代理(Proxy)[/size][/b]

一个类被AOP织入增强后,就产出了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。

[b] [size=large]切面(Aspect)[/size][/b]

切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

AOP的工作重心在于如何将增强应用于目标对象的连接点上,这里首先包括两个工作:第一,如何通过切点和增强定位到连接点上;第二,如何在增强中编写切面的代码。本章大部分的内容都围绕这两点展开。

[b][size=x-large]AOP的实现者[/size][/b]


AOP工具的设计目标是把横切的问题(如性能监视、事务管理)模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接点模型,它提供了一种机制,可以识别出在哪里发生了横切。

 [b] [size=large]AspectJ[/size][/b]

AspectJ是语言级的AOP实现,2001年由Xerox PARC的AOP小组发布,目前版本已经更新到1.6。AspectJ扩展了Java语言,定义了AOP语法,能够在编译期提供横切代码的织入,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。主页位于http://www.eclipse.org/aspectj。

[b] [size=large]AspectWerkz [/size][/b]

基于Java的简单、动态、轻量级的AOP框架,该框架2002年就已经发布,由BEA Systems提供支持。它支持运行期或类装载期织入横切代码,所以它拥有一个特殊的类装载器。现在,AspectJ和AspectWerkz项目已经合并,以便整合两者的力量和技术创建统一的AOP平台。他们合作的第一个发布版本是AspectJ 5:扩展AspectJ语言,以基于注解的方式支持类似AspectJ的代码风格。

[b] [size=large]JBoss AOP [/size][/b]

2004年作为JBoss应用程序服务器框架的扩展功能发布,读者可以从这个地址了解到JBoss AOP的更多信息:http://www.jboss.org/products/aop。

[b] [size=large]Spring AOP [/size][/b]

Spring AOP使用纯Java实现,它不需要专门的编译过程,不需要特殊的类装载器,它在运行期通过代理方式向目标类织入增强代码。Spring并不尝试提供最完整的AOP实现,相反,它侧重于提供一种和Spring IoC容器整合的AOP实现,用以解决企业级开发中的常见问题。在Spring中,我们可以无缝地将Spring AOP、IoC和AspectJ整合在一起。

这些文章摘自于我的[b][color=red]《Spring 4.x企业应用开发实战》[/color][/b]的第6章。欢迎大家讨论。

延伸阅读:学习Spring必学的Java基础知识----动态代理[url]http://www.iteye.com/topic/1123293[/url]
spring-springMVC开发文档和AOP详解 spring-springMVC开发文档和AOP详解,便于学习运用框架知识 立即下载

相关推荐

搭建微信机器人的方案都在这了!

功能超级强大,虽不支持二次开发,但已有的功能足够个人使用,可惜官方作品已被腾讯告死,好在市面上还流落着不少破解版,有需要的自行搜索。可惜的是,微信官方已不准许新的微信号再使用 web 登录,这就直接从源头扼杀了 web 协议的微信机器人,虽说老的微信号还是能凑合着用,不过部分功能也受限。所以,这些都属于 PC 端的微信机器人。无论是 PC 端还是手机端,用 hook 方式实现的最大缺点就是要和某一个版本的微信客户端进行绑定,如果框架本身不对最新版本的微信适配,那使用的时候就无法升级到最新版本的微信。

weixin_47246330的博客 1万+

【Spring AOP(面向切面)切点、切面和通知介绍以及应用】

切点定义了在哪些连接点(Join Point)上应用切面逻辑。连接点是程序执行过程中的一些特定的点,例如方法调用、方法执行、构造函数调用等。切点通过表达式来精确地指定这些位置。在 Spring AOP 中,通常使用 AspectJ 切点表达式来定义。例如,通过execution(* com.example.service…(…))这样的表达式,可以指定在com.example.service包及其子包下的所有类的所有方法上应用切面逻辑。

weixin_56693899的博客 2713

Spring Authorization Server实战:从零搭建OAuth2.1授权中心(含数据库改造)

本文详细介绍了如何从零开始使用Spring Authorization Server搭建符合OAuth2.1规范的授权中心,并完成关键的数据库持久化改造。内容涵盖微服务架构下的统一认证需求、基础配置、数据库表设计、高级特性(如令牌自定义、性能优化)以及与现有系统(如SSO、Gateway网关)的集成实战,为构建生产级授权服务提供完整指南。

weixin_29315091的博客 253

Spring AOP

Aspect //定义切面@Component//切点(配置拦截规则)}}对上面代码的解释:@Aspect这个注解表示这个类是一个AOP类,也就是说这个类是一个切面;@Component这个注解表示组件,当我们不知道具体该给某个类使用那个注解来注入到Spring框架时,我们就可以使用@Component这个注解;@Pointcut这个注解表示该方法是一个切点,它后面跟的是AspectJ表达式(切点表达式)。

yahid的博客 1232

从拆解到调试:用CS5523改造旧款车载显示屏的完整记录(MIPI转eDP方案)

本文详细记录了使用CS5523芯片将旧款车载显示屏从MIPI接口改造为eDP驱动的完整过程。通过对比LT8911等芯片,选择CS5523实现低功耗、高兼容性的显示升级,涵盖硬件改造、固件配置及调试技巧,最终成功提升显示效果200%。

web99的专栏 344

浅显易懂理解AOP

理解AOP(JDK+cglib) 什么是AOP Aspect Oriented Programing 面向切面编程, 相比较 oop 面向对象编程来说, Aop关注的不再是程序代码中某个类,某些方法,而 aop 考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。 联想大家吃的汉堡(中间夹肉)。那么 aop是怎么做到拦截整个面的功能呢?考虑中级学到的 servlet urlpattern /* 的配置 ,实际上也是 aop 的实现 。 Aop的功能 AOP 主要应用于日志记录,性

weixin_41843069的博客 282

【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能

在探讨计算机性能优化的旅程中,我们常常被引导去关注算法的复杂度、代码的优化,或是更高效的数据结构。然而,有一个经常被忽视的角色在幕后默默地影响着程序的运行效率——那就是缓存(Cache)。正如哲学家亨利·戴维·梭罗在《瓦尔登湖》中所说:“细节是造成美丽的源泉”,在软件开发的世界里,对缓存的理解和优化,就是那些决定程序性能优雅与否的细节。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3734

Spring实现AOP的4种方式

Spring实现AOP的4种方式

2636

【测开求职】面试题:计算机网络 详细版整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。读者可以先查看上面的链接走一遍计算机网络的整体框架结构。其中,重点难点以及易混淆的知识点,笔者会用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 5936

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2588

【实习第一周】spring入门

一、spring概述 spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IOC和AOP为内核,提供了展现层spring mvc和持久层spring jdbc以及业务层事物管理等众多的企业级应用技术,整合了开源第三方类库。spring提供了“一站式”选择,是因为spring贯穿展现层、业务层和持久层。        spring特点:        1. 全面和模块化的,有

Frank_hxc的专栏 777

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3834

明明白白AOP(傻瓜也会心领神会)

引子:  AOP(面向方面编程:Aspect Oriented Programing)和IoC一样是Spring容器的内核,声明式事务的功能在此基础上开花结果。但是AOP和OOP差别较大,要很好地理解这个概念,做到心领神会还是不容易的,不过相信看完帖子,你就不再迷惑了。   编程语言最终极的目标就是能以更自然、更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,编程语言一步步

softmanfly的专栏 577

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...

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring基础(精通Spring+4.x++企业应用开发实战 第7章)

AOP

ahaha413525642的博客 2106

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring AOP概念理解

1.我所知道的aop   初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。   2.为什么用aop   1就是为了方便,看一个国外很有名的大师说,编程的...

宏桥科技------PowerBridge 3871

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

对Spring Aop的理解和应用场景

场景一:Aop与事物 场景二:Aop与日志 场景三:Aop与缓存

坚持、努力、忍耐 2万+

Spring学习(九)-AOP编程【上】

AOP的概述 AOP是Aspect Oriented Programming的简称,称为面向切面编程。AOP独辟蹊径通过横向抽取机制为一些类无法通过纵向继承体系进行抽象的重复性代码提供了解决方案。AOP应用的场合是受限的。它一般只适合于那些具有横切逻辑的应用场合:如性能监测、访问控制、事务管理以及日志记录等。 例子: ..... public class ForumService{ privat...

weixin_42544630的博客 181

面向切面编程AOP的浅显理解(一)

最近在看《Spring源码深度解析》这本书,里面有一章专门来介绍AOP,鉴于以前也看过用过AOP的东西,但是这些东西都比较零碎,没有很深入很系统的去了解,在这里我简单总结一下。     一般情况下,我们都对OOP比较熟悉,面向对象编程在我们日常生活中简单都能遇得到,更容易理解,但是AOP这个面向切面编程,咋一看是懵逼的。AOP是Aspect Oriented Programming的简称,从英文

郭浩(C/C++) 734

Spring基础:切面

前言在之前的文章中总结了 AOP 在 Spring 中的作用及地位,在分析 AOP 时涉及到切面的内容,这一节详细的分析切面的知识点。正题在开始文章前,有几个问题需要思考一下:切面到底是神马切面的构成切面有哪些实现类切面有哪些类型1. 切面到底是神马在 AOP 一文中提到什么是 AOP? AOP 可以使用 “面向切面编程”的译法。那切面就是把非业务逻辑相关的代码抽取出来定位到具体的连接点上的一种实...

水知道答案 1万+

Spring AOP的一个比喻和IOC的作用

aop切面编程就是在常规的执行java类中方法前或执行后加入自定义的方法。比如你本来每天都去打酱油,去,打酱油,回。现在我每天在你打酱油路上等着,你去打酱油的时候我打你一顿,回来的时候给你点糖果吃。你根本不知道为什么我会在路上拦住打你。所以在切面中插入你自定义的方法,这个方法的执行和本身要执行的类方法无关系,也就是不是这个类的方法来调用你写的方法的,你写的方法什么时候执行都是要通过在配置指定。我打...

weixin_33901843的博客 165

SpringMVC AOP 注解模式 全局管理访问日志

SpringMVC AOP 注解模式 全局管理访问日志 ​ 注:此处不详细讲解aop的使用方式,只记录一个使用过的例子并配上一点说明 我们需要开启自动注入,让spring自动实现织入 <aop:aspectj-autoproxy /> @annotation注解 对于切面来说,我们一般会定义一个切点Pointcut,这里不讲这个。想说的是,我们定义Advice的时候, ...

第二庄 1240

SpringMVC学习笔记(三) 切面详解

为了更好的理解AOP,先来了解几个AOP的术语。 通知(Advice) 指切面(定义为aspect的类)中的工作; spring切面可以应用的五种通知: 前置通知(Before):在目标方法被调用之前调用通知功能; 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么; 返回通知(After-returning):在目标方法成功执行之后调用通知; 异常通知

4444

springMVC的Aop

Aop是面向切面编程:是通过预编译方式和运行器动态代理实现程序功能的统一维护技术。Aop是oop的延续,是spring框架中的重要内容,是函数编程的一种衍生泛型,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑部分之间的耦合度降低提高程序的可重用行,提高开发的效率。 Aop的作用是: 在程序运行期间,在不修改源码的情况下对方法进行功能性增强。 优势:减少重复代码,提高开发效率,并且便于维护。 Aop的底层实现: Aop的底层是使用Spring提供的动态代理技术实现的,在...

qq_48569009的博客 2110

面试过阿里等互联网大公司,我知道了这些套路 | 掘金技术征文

前面感谢一波正文开始招聘职位需求套路招聘面试的套路简历撰写套路简历投递套路找工作经历自己面试面经 亚信爱奇艺 笔试(半个小时)第一轮面试(80 分钟)第二轮面试(半个小时)总结: 阿里哔哩哔哩目前所在公司 实习感悟书籍推荐 JavaLinux计算机网络计算机系统数据库Python工具其他 优秀网站推荐优秀博客推荐求职资料放送最后 前方高能,本文快一万两千字,最好点

itheima_Wujie的博客 6643
上一篇: Dubbo
下一篇: 探索 JUnit 4.4 新特性
quickselect
博客等级 码龄20年 1粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值