本文主要介绍AOP思想,而不是Spring,Spring在本文只做为理解AOP的工具和例子,所以也不打算介绍Spring的Aspect、Join point、Advice、AOP proxy等概念,那样初学者会很难理解,如果你懂了AOP的思想,那么Spring的AOP,还是AspectJ都容易理解了。

Spring如此流行,当我第一次接触Spring的时候,到网上看了一些文章,都讲得神乎其乎,最后我篇也没看懂,我当时就是认为这个东西一定很高深,于是我就遇到做WEB开发的人就会打听一下。得到最多的一个回答就是“Spring是一个框架”,然后我就会问框架是什么,但都没有一种说法不让我感觉玄乎乎的,同时也没有听懂,于是,我更感觉Spring很神了,这可能叫做朦胧美。还有一种说法就是“Spring两个首要的特性就是AOP和IoC”,这种说法让我感觉Spring简直神的飞上天了,我都不敢接着问了,再问可能想上天去找Spring了,后来我就怀疑这玩意儿真有那么高深吗,强列的好奇心让我实在hold,决定一定要试一下这个神器,于是就看了一些Step By Step的文章,自己写了一个HelloWorld,发现这AOP确实是一个比较新颖的思想,也算是打破了常规,是从不同方面思考问题。不过没有那些童鞋说得那么神。

本文旨在帮助还没有理解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正。

先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,Spring是一个库,一个Java库,所以我个人觉得应该这样回答Spring是什么:Spring是一个库,它的功能是提供了一个软件框架,这个框架目的是使软件之间的逻辑更加清晰,配置更灵活,实现这个目的的手段使用AOP和IoC,而AOP和IoC是一种思想,是一种什么样的思想呢,等下细说,先说AOP在Java里是利用反射机制实现(你也可以认为是动态代理,不过动态代理也是反射机制实现的,所以还是先不要管动态代理,我们这里化繁为简,不让它干扰咱们对AOP的理解),如何使用AOP呢,很简单滴,等下介绍。

下面先说AOP是什么样的思想,我们一步一步慢慢来,先看一下传统程序的流程,比如银行系统会有一个取款流程

我们可以把方框里的流程合为一个,另外系统还会有一个查询余额流程,我们先把这两个流程放到一起:

有没有发现,这个两者有一个相同的验证流程,我们先把它们圈起来再说下一步:

有没有想过可以把这个验证用户的代码是提取出来,不放到主流程里去呢,这就是AOP的作用了,有了AOP,你写代码时不要把这个验证用户步骤写进去,即完全不考虑验证用户,你写完之后,在另我一个地方,写好验证用户的代码,然后告诉Spring你要把这段代码加到哪几个地方,Spring就会帮你加过去,而不要你自己Copy过去,这里还是两个地方,如果你有多个控制流呢,这个写代码的方法可以大大减少你的时间,不过AOP的目的不是这样,这只是一个“副作用”,真正目的是,你写代码的时候,事先只需考虑主流程,而不用考虑那些不重要的流程,懂C的都知道,良好的风格要求在函数起始处验证参数,如果在C上可以用AOP,就可以先不管校验参数的问题,事后使用AOP就可以隔山打牛的给所有函数一次性加入校验代码,而你只需要写一次校验代码。不知道C的没关系,举一个通用的例子,经常在debug的时候要打log吧,你也可以写好主要代码之后,把打log的代码写到另一个单独的地方,然后命令AOP把你的代码加过去,注意AOP不会把代码加到源文件里,但是它会正确的影响最终的机器代码。

现在大概明白了AOP了吗,我们来理一下头绪,上面那个方框像不像个平面,你可以把它当块板子,这块板子插入一些控制流程,这块板子就可以当成是AOP中的一个切面。所以AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面,这句话应该好理解吧,我们把纵向流程画成一条直线,然把相同的部分以绿色突出,如下图左,而AOP相当于把相同的地方连一条横线,如下图右,这个图没画好,大家明白意思就行。

    

这个验证用户这个子流程就成了一个条线,也可以理解成一个切面,aspect的意思我认为是方面,你用什么实物去类比,只要你能理解都可以。这里的切面只插了两三个流程,如果其它流程也需要这个子流程,也可以插到其它地方去。

讲了这么多,那到AOP该如何使用呢?我们要写一个HelloWorld吗,我看还是算了,关于这种类型的文章,网上已经泛滥成灾,我再写也不一定比人家写得好,所以,我会在下面贴几个我认为写得不错的文章链接,但我在这里先介绍一下Spring如何实现AOP的吧。其实也不难理解,Spring的实现是基于函数(或叫方法)的,就是说,你写好了一个函数后,你还可以在不更改原来的代码情况,通过Spring在函数前或函数后动态的加入新的代码。比如你原来的代是这样的:

void foo() {System.out.println("in foo()");
}

然后你想在函数执行前(当成也可以加到执行后,或前后都加,原理是一样)加一句:

System.out.println("before execute foo()");

你也可以多加几句,通过Spring,你可以把这些代码动态的加到函数前面,而不用改变原来的代码。从而会得到与以下等效的执行码:

void foo() {System.out.println("before execute foo()");System.out.pringln("in foo()");
}

我这样一说你可能更想亲手试试了,可以看看以下这篇文章,写得很好,我们在此也感谢其作者的辛勤付出。

一个简单的Spring的AOP例子

spring框架AOP的理解,程序高类聚的体现相关推荐

  1. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  2. Spring框架AOP源码剖析

    今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西的源码剖析,作为多年的开发者,想必大家在面试的时候都被问过,你知道Spring框架AOP的底层实现机制吗 ...

  3. 高类聚与低耦合(初步认识)

    低耦合和高内聚是我们所追求的,低耦合是指一个程序中各个模块之间的联系少和相互依赖程度低,一个模块实现具体实现一个功能,各个类之间联系越少,相互依赖程度越低.共用或者传输的参数越少,则它们之间的耦合度越 ...

  4. CPPDay05 C的静态成员,类的静态成员,单例模式,静态成员函数,继承(面向对象三大特性,高类聚,低耦合),继承方式(private,protected,public)多重复杂继承,虚继承

    目录 0x00 C中的静态成员: 0x01类的静态成员: 0x02单例模式: 0x03静态成员函数: 0x04继承: 0x05继承方式: 0x06多重复杂继承: 0x07虚继承: 0x00 C中的静态 ...

  5. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  6. Spring框架-AOP

    1.什么是AOP? 面向切面编程,可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 通过不修改源代码方式,在主干功能里面添加新功能 2 ...

  7. 浅谈Spring框架AOP概念

    何为AOP? AOP(Aspect Oriented Programming,面向切面编程):AOP是一种新的方法论,在这之前相信我们都听过面向对象编程(OOP),AOP就是对OOP的补充,它们的关系 ...

  8. Spring框架——AOP入门笔记以及个人总结

    注:作者本人也是初学者,所以本文有些总结性见解可能存在问题,但是多数问题都是在上网查询过资料后总结的,如果有逻辑或者原理上的错误,或者见解不同,欢迎在评论区讨论!!! 目录 Spring的AOP 1. ...

  9. Spring框架 AOP

    AOP(Aspect Oriented Programming) 原理 正常程序执行顺序都为纵向执行流程 ,在某一个步骤的前后,做一个前置通知 和后置通知,这个过程称为切面编程. 即:在原有的纵向执行 ...

最新文章

  1. 控制C++的内存分配
  2. matlab-等高线图-三维曲线的绘制
  3. 网易云音乐网络库跨平台化实践
  4. HDLBits答案(21)_Verilog有限状态机(8)
  5. Java学习笔记——模块化
  6. ssm整合之web.xml配置
  7. 苹果高管谈及近期员工担忧,呼吁其向管理层报告职场问题
  8. Android通过广播接收者调用服务内方法
  9. 搜集-类似Visio绘图软件
  10. 园林景观cad_9套CAD平面设计素材图,上千个绘图模板随意用,全部打包带走
  11. 基于LED恒流驱动芯片芯鼎盛TX6122设计的DC-DC降压恒流DEMO
  12. 20180925-7 规格说明书——吉林市两日游
  13. 使用u盘如何装linux系统教程视频教程,使用U盘安装Linux系统图解一
  14. 2012服务器系统怎么安装sql,使用安装向导安装 SQL Server 2012(安装程序)
  15. 计算机系统引导失败怎么办,win7系统引导选择失败怎么办|win7系统引导选择失败的解决方法...
  16. 怎么给视频添加水印?几个简单的步骤就搞定
  17. python怎么画圆螺旋线_Python turtle 绘制彩色螺旋线
  18. 通话录音自动上传功能
  19. 简单易用的APP专项测试工具iTest4.7.0发布啦
  20. python 安装问题

热门文章

  1. Web开发中的路由是什么意思?(关键词:Web开发/路由)
  2. 超详细推导样本方差和总体方差(n-1的由来)
  3. 火车售票系统的设计与实现
  4. vscode对比vs:花落谁家
  5. 调度算法先来先服务(FCFS)、最短作业优先(SJF)和最高响应比优先(HRRN)算法
  6. 关于安卓智能聊天机器人simsimi的实现方法
  7. Unity融合计费接入(电信爱游戏)
  8. 话里话外:“两化融合”既是国家的号召,更是装备制造业的迫切需要
  9. php实现stripos,PHP stripos
  10. 基于无速度传感器的永磁同步电机矢量控制研究