spring AOP的基本概念
AOP的概念和使用原因
现实中有一些内容并不是面向对象(OOP)可以解决的,比如数据库事务,它对于企业级的Java EE应用而言是十分重要的,又如在电商网站购物需要经过交易系统、财务系统,对于交易系统存在一个交易记录的对象,而财务系统则存在账户的信息对象。从这个角度而言,我们需要对交易记录和账户操作形成一个统一的事务管理。交易和账户的事务,要么全部成功,要么全部失败。
交易记录和账户记录都是对象,这两个对象需要在同一个事务中控制,这就不是面向对象可以解决的问题,而需要用到面向切面的编程,这里的切面环境就是数据库事务。
AOP编程有着重要的意义,首先它可以拦截一些方法,然后把各个对象组织成一个整体,比如网站的交易记录需要记录日志,如果我们约定好了动态的流程,那么就可以在交易前后、交易正常完成后或者交易异常发生时,通过这些约定记录相关的日志了。
回到JDBC的代码中,令人最讨厌和最折腾的问题永远是无穷无尽的try...catch...finally...语句和数据库资源的关闭问题,而且这些代码会存在大量重复,加上开发者水平参差不齐。Spring出现前,在Java EE的开发中,try...catch...finally语句常常被严重滥用,使得Java EE的开发存在着许多问题,虽然MyBatis对JDBC做了良好的封装,但是还是不足的。


这里购买交易的产品和购买记录都在try...catch...finally...语句中,首先需要自己去获取对应的映射器,而业务流程中穿插着事务的提交和回滚,也就是如果交易可以成功,那么就会提交事务,交易如果发生异常,那么就回滚事务,最后在finally语句中会关闭SqlSession所持有的功能。
但是这并不是一个很好的设计,按照Spring的AOP设计思维,它希望写成如代码清单所示的代码。

这段代码除了一个注解@Transactional,没有任何关于打开或者关闭数据库资源的代码,更没有任何提交或者回滚数据库事务的代码,但是它却能够完成如代码清单所示的全部功能。注意,这段代码更简洁,也更容易维护,主要都集中在业务处理上,而不是数据库事务和资源管控上,这就是AOP的魅力。
面向切面编程的术语
1. 切面(Aspect)
切面就是在一个怎么样的环境中工作。比如数据库的事务直接贯穿了整个代码层面,这就是一个切面,它能够在被代理对象的方法之前、之后,产生异常或者正常返回后切入你的代码,甚至代替原来被代理对象的方法,在动态代理中可以把它理解成一个拦截器。
2. 通知(Adice)
•通知是切面开启后,切面的方法。它根据在代理对象真实方法调用前、后的顺序和逻辑区分,它和约定游戏的例子里的拦截器的方法十分接近。
•前置通知(before):在动态代理反射原有对象方法或者执行环绕通知前执行的通知功能。
•后置通知(after):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。无论是否抛出异常,它都会被执行。
•返回通知(afterReturning):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。
•环绕通知(aroundThrowing):在动态代理中,它可以取代当前被拦截对象的方法,通过参数或反射调用被拦截对象的方法。
3. 引入(Introduction)
引入允许我们在现有的类里添加自定义的类和方法。
4. 切点(Pointcut)
在动态代理中,被切面拦截的方法就是一个切点,切面将可以将其切点和被拦截的方法按照一定的逻辑织入到约定流程当中。
5. 连接点(join point)
连接点是一个判断条件,由它可以指定哪些是切点。对于指定的切点,Spring会生成代理对象去使用对应的切面对其拦截,否则就不会拦截它。
6. 织入(Weaving)
织入是一个生成代理对象的过程。实际代理的方法分为静态代理和动态代理。静态代理是在编译class文件时生成的代码逻辑,但是在Spring中并不使用这样的方式,所以我们就不展开讨论了。一种是通过ClassLoader也就是在类加载的时候生成的代码逻辑,但是它在应用程序代码运行前就生成对应的逻辑。还有一种是运行期,动态生成代码的方式,这是Spring AOP所采用的方式,Spring是以JDK和CGLIB动态代理来生成代理对象的
Spring对AOP的支持
AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一。每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行拦截。而Spring AOP是一种基于方法拦截的AOP,换句话说Spring只能支持方法拦截的AOP。在Spring中有4种方式去实现AOP的拦截功能。
•使用ProxyFactoryBean和对应的接口实现AOP。
•使用XML配置AOP。
•使用@AspectJ注解驱动切面。
•使用AspectJ注入切面。
在Spring AOP的拦截方式中,真正常用的是用@AspectJ注解的方式实现的切面,有时候XML配置也有一定的辅助作用。对于ProxyFactoryBean和AspectJ注入切面的方式这两种方式已经很少用了。

spring AOP的基本概念的更多相关文章
- 我所理解的Spring AOP的基本概念
Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了非常多样例后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 如果一个OA系统中的一个 ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)(转)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- Spring AOP(一)--基本概念
AOP(Aspect Oriented Programing),意为面向切面编程,其实看了很多书本的介绍和说明,我觉得这些解释都太过书面,也可能是翻译的原因,总觉得还是不太懂,也难以理解这种叫法,尤其 ...
- Spring学习十三----------Spring AOP的基本概念
© 版权声明:本文为博主原创文章,转载请注明出处 什么是AOP -面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 -主要的功能是:日志记录.性能统计.安全控制.事务处理. ...
- 循序渐进之Spring AOP(2) - 基本概念
学习AOP前要先了解几个重要术语:Joinpoint.Pointcut.Advice 仍然以改装车比喻,拿到心爱的汽车后想做改装,第一件事是什么?找到要改装的地方.车上可改装的地方很多,但每个人感兴趣 ...
- Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
Spring AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
- Spring AOP术语解释
话说,越来越感觉有些人解释概念真的是晦涩难懂,我刚开始学习Spring aop时,对那些切入点,连接点,引入等概念搞得头疼.太多人就直接照搬定义,让我们这些初学者如何理解啊.下面是我找了大量的博客,终 ...
- Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)
本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%A ...
随机推荐
- ES中的分析和分析器
在ES存储的文档,进行存储时,会对文档的内容进行分析和分词 分析的过程: 首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 reca ...
- Springboot打包及远程调试
如果您使用Spring Boot Maven或Gradle插件来创建可执行jar,则可以使用来运行您的应用程序java -jar,如以下示例所示: $ java -jar target / myapp ...
- shiro授权+注解式开发
shiro授权和注解式开发 1.shiro授权角色.权限 2.Shiro的注解式开发 ShiroUserMapper.xml <select id="getRolesByUserId& ...
- flutter ListView 页面滚动组件
ListView class A scrollable list of widgets arranged linearly. ListView is the most commonly used sc ...
- am335x system upgrade kernel usb stroage(十)
1 Scope of Document This document describes USB hardware design, support stardard usb2.0 port o ...
- Linux 的磁盘格式化、挂载、磁盘检验、df、du、fdisk、free命令的使用
df:列出文件系统的整体磁盘使用量du:检查磁盘空间使用量fdisk:用于磁盘分区 free:查看内存占用情况 一.df命令列出系统的整体磁盘使用量 df命令参数功能:检查文件系统的磁盘空间占用情况. ...
- git的实际工作经验总结
分支工作的一个较佳的实践, 即git工作的最佳实践 从最初的svn到后来的git,上来给我的感觉就是git更方便, 可以在本地进行版本的提交,回退. 后来对hash有所了解, 知道了git的每个版本其 ...
- CF1217题解
E 也不知道为啥这题咕了好久~ 有一个明显的结论:如果存在有一位有两个数该为不为0,则这两个数可以组成一个满足条件的解 每一位分别维护不为0的和最小的即可
- LeetCode之最大子段和
1.原问题 给定一个数组,求这个数组的连续子数组中,最大的那一段的和.如数组[-2,1,-3,4,-1,2,1,-5,4] 的子段为:[-2,1].[1,-3,4,-1].[4,-1,2,1].….[ ...
- vue中全局filter和局部filter怎么用?
需求: 将价值上加上元单位符号(全局filter) <template> <div> 衣服价格:{{productPrice|formatTime}} </div> ...