博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP入门——概念和注意事项
阅读量:7080 次
发布时间:2019-06-28

本文共 1936 字,大约阅读时间需要 6 分钟。

AOP什么?

AOP在功能方面,它是之前和之后运行一些业务逻辑,一些操作(比方记录日志、或者是推断是否有权限等),这些操作的加入。全然不耦合于原来的业务逻辑。从而对原有业务逻辑全然是透明。

也就是说。这段操作和业务逻辑是全然分开的,它可能在项目中须要横切多个模块。且其自身也是一个独立的模块,贯穿了整个项目。我们全然能够依据须要启用或者停用这个功能。 AOP的典型应用就是事务管理和日志。

AOP中的概念

以下这些术语并非Spring定义的。因为AOP中的术语不是那么形象,所以假设Spring再自定义一套的话那么会使得这些概念更加混淆。

a) 切面(Aspect):一个横切关注点的模块化。在企业级JAVA应用中,事务管理是一个关于横切关注点的典型样例。在Spring AOP中,切面能够用常规类(基于shcema)或者用常规类并加上注解来实现(基于@AspectJ)。

b) 通知(Advice):由切面在特定的连接点运行的动作称为通知。不同类型的通知包含,前置通知、围绕通知、后置通知等。

很多AOP框架,包含Spring,把通知模拟成一个拦截器。围绕着连接点维护一个拦截器链。

c) 连接点(JoinPoint):程序运行过程中的一个点,比方说运行方法或者是处理异常。在Spring Aop中。一个连接点总是代表一个方法的运行。

d) 目标对象(Target Object):也就是须要被通知的对象。所以也叫被通知对象(advised object)。因为Spring AOP是用执行时代理来实现的,所以这个对象总是个被代理的对象。

e) AOP代理(AOP proxy):AOP框架创建用来实现实现AOP功能的。在Spring框架中,AOP代理能够基于JDK动态代理,也能够是基于CGLIB的代理。

f) 织入(Weaving):把切面和其他应用类型或者对象来创建一个目标对象。

能够在编译期(比方使用 AspectJ编译器),装载阶段或者是执行时完毕。正如别的纯JavaAOP框架一样,Spring AOP在执行时实现织入。

通知类型

a) 前置通知(Before advice):在连接点之前运行,可是无法阻止连接点的运行(除非当中抛出异常)

b) 后置返回通知(After returning advice):在连接点正常运行完毕后运行,比方一个方法正常返回且没有抛出异常

c) 后置异常通知(After throwing advice):在被通知方法抛出异常后运行

d) 后置通知(After (final) advice):仅仅要连接点运行那就一定会运行,无论是抛出异常还是正常返回

e) 围绕通知(Around advice):这是最强大的通知,它能够实现前置通知和后置通知,而且它还能够来控制①是否运行连接点②返回值③抛异常

围绕通知是最常见的一种通知。Spring AOPAspectJ一样提供了全范围的通知类型,所以官方文档给出的建议是使用“最弱小”的通知来实现我们的需求,为什么呢?你懂的,杀鸡焉用牛刀。且复杂的东西easy出错。比方,假设你仅仅须要用法的返回值更新一下缓存,尽管围绕通知也能够满足这一要求,但使用一个后置返回通知将要比使用一个围绕通知要好。使用最合适的通知类型会让你的编程模型变的简单,从而避免一些潜在的错误。

比方,你不须要去调用ProceedingJoinPointproceed()方法,因此你不会由于调用它而出错。

连接点的概念和切入点一样,都是AOP的核心。

它们让AOP差别于更老的一些仅仅提供拦截器的技术。

切入点能把通知指向到目标,而不必局限于OOP的结构。比方,围绕通知能够对那些横跨多个对象的方法(比方服务层的全部业务方法)提供事务管理。

须要注意的地方

1、若存在around,且around未proceed目标方法。那么after则不会被触发

2、若存在around,且proceed目标方法抛出异常。那么proceed之后的语句就不会运行到,而是直接到after or after returing

3、若存在around,且around正常运行。那么around方法的返回值。也就是在after-returning中可以获得的返回值

4、若不存在around,那么after-returning可以获得的返回值就是目标方法运行后的返回值

5、around就算不给返回值,也不会妨碍目标方法的调用,并不像网上说的那样会导致目标方法停止调用并返回null

6、事务是与线程绑定的,如果在该方法中打开一个新的线程,所以很自然独立于先前的交易

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
RxJava系列六(从微观角度解读RxJava源码)
查看>>
WWDC 2015大会十大看点总结:Swift要开源了
查看>>
墨瞳漫画 升级vue2 踩坑
查看>>
I/O重定向和管道
查看>>
MindFusion.WinForms Pack v2016.R2发布
查看>>
为什么 NSLog 不支持 Swift 对象
查看>>
如何优雅的选择字体(font-family)
查看>>
为 Koa 框架封装 webpack-dev-middleware 中间件
查看>>
深入浅出JavaScript:理解函数
查看>>
将群晖 NAS 安全地暴露到公网中
查看>>
【二次元的CSS】—— 用 DIV + CSS3 画咸蛋超人(详解步骤)
查看>>
Android程序逆向分析
查看>>
在阿里云centOS环境下搭建基于thinkphp的网站
查看>>
RegEx 快速掌握最基本的正则语法
查看>>
过去的2015年
查看>>
Webpack + React 开发之路
查看>>
【译】使用 AngularJS 和 Electron 构建桌面应用
查看>>
【经验总结】记一次艰难的居中--日历榜单
查看>>
所有博客将会誊到http://www.xumenger.com/
查看>>
Jodd 5.0.8 发布,Java 常用工具包
查看>>