Spring-AOP(面向切面编程)

摘要:
这避免了将大量与系统相关的逻辑混合到业务逻辑代码中——例如权限管理、AOP代码增强对象、使用代理增强对象(BeanPostProcessor)。Spring AOP使用纯Java实现,并在运行时通过代理将增强的代码编织到目标类中,AspecJ是一个基于Java语言的AOP框架。AOP编程应用场景事务管理记录日志监控性能(统计方法运行时间)权限控制缓存主要用于:

什么是AOP

  AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
Spring-AOP(面向切面编程)第1张
  • AOP: 面向切面编程: 目标: 增强代码(方法),   把方法横向的拆分
  • OOP: 面向对象编程: 封装,继承,多态, 把项目划分为不同模块(对象)

AOP思想:采用代理思想,在不改变原来目标代码前提下,实现功能增强!

  IoC 工厂制造对象,AOP 代码增强对象,在工厂制造对象过程中,使用代理进行对象的增强(BeanPostProcessor )

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码,Spring2.0之后,Spring AOP引入对Aspectj的支持,AspecJ是一个基于Java语言的AOP框架.

AOP编程应用场景

  • 事务管理
  • 记录日志
  • 监测性能(统计方法运行时间)
  • 权限控制
  • 缓存

主要目的:

  将日志记录,性能统计,安全控制,事务处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP相关术语

  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点.
  • Pointcut(切入点):所谓的切入点是指我们要对哪些Joinpoint进行拦截的定义
  • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的事情)
  • Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Field
  • Target代理的目标对象
  • Weaving(织rget(目标):入):是指把增强应用到目标对象来创建的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
  • Aspect(切面):是切入点和通知(引介)的结合

Spring-AOP(面向切面编程)第2张

个人理解

Joinpoint(连接点) :一个类的所有方法
Pointcut(切入点):需要增强的这个方法
Advice(通知/增强): 对目标对象增强的代码(日志,事务,权限等)
Introduction(引介):一种特殊的通知
Target: 目标对象,需要增强方法的这个类
Weaving(织rget(目标):入): 把通知添加到这个方法中
Proxy(代理): 被代理类(一个类被AOP织入增强后,就产生一个结果代理类)
Aspect(切面):是切入点和通知(引介)的结合

 AOP的五种增强类型

前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只支持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。
后置增强:org.springframework.aop.AfterReturningAdvice是目前可用的后置增强,表示在目标方法执行后实施增强。
环绕增强:org.aopalliance.intercept.MethodInterceptor代表了环绕增强,表示在目标方法执行前后实施增强。直接使用了AOP联盟定义的接口。
异常抛出增强:org.springframework.aop.ThrowsAdvice代表了异常抛出增强,表示在目标方法抛出异常后实施增强。
引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性。

Spring将introduction通知看作一种特殊类型的拦截通知。用Spring的行话来讲,对方法的增强叫做Wearing(织入),而对类的增强叫introduction(引入)。

Introduction Advice(引入增强)就是对类的功能增强,它也是Spring AOP 提供的一种特殊增强。

1)  前置增强,    增强是在目录方法之前执行

2) 后置增强,   增强是在目录方法之后执行, 目标方法没有发生异常

3) 最终增强,  不管目标方法是否有异常,都会执行

4) 异常增强,  在目标发生异常的时候,进行增强

5) 环绕增强:   一个顶替上面四个增强

 

免责声明:文章转载自《Spring-AOP(面向切面编程)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇常用中文分词工具分词&词性标注简单应用(jieba、pyhanlp、pkuseg、foolnltk、thulac、snownlp、nlpir)NSURLSession的基本使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

让我们一起学习如何使用AIDL,它其实并不难(Android)

前言 该篇文件讲述的是AIDL最基本的使用(创建、调用),关于对于AIDL更深的认识,在后续的随笔中,会持续与大家分享并探讨。 正文 AIDL的定义(什么是AIDL?) AIDL的应用场景(AIDL可以做什么?) 如何写一个AIDL的应用?(代码) AIDL概述(定义) AIDL:Android Interface Definition Langua...

[Swift]遍历集合类型(数组、集合和字典)

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://...

URL编码方法比较 Encode,Javascript,escape,encodeURI,encodeURIComponent,UTF8

javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent()。这几种编码所起的作用各不相同。 escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等...

关于C#调用C++ 的DLL传送字符串显示乱码的解决

最近在做一个程序,想把某些功能用C++写成DLL供C#调用,但是在写好DLL用C#传递字符串参数时,在DLL中显示传送过来的字符串是乱码,DLL里的代码根本无法用这些字符串进行其它的处理.为此,花了一天时间在全网翻了一遍,发现没有一篇能完美的解决问题的,当然也有部分的提示是正确的.在经过一翻调试后.终于找到解决问题的办法,在此写下以备忘,也给需要的人参考,...

通知栏Notification的整理

一、介绍          通知栏适用于交互事件的通知,是位于顶层可以展开的通知列表。 二、功能作用   1.显示接收到短消息,及时消息等信息(如QQ、微信、新浪、短信)       2.显示客户端的推送消息(如有新版本发布,广告。推荐新闻等)   3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等) 三、Notific...

Houdini中给火花渲染准确的运动模糊

估计大家都知道使用运动速度来进行运动模糊的渲染,但是往往这个方法得到的运动模糊都是线性变化的,虽然乍一看没什么问题,但是如果想要每一帧的模糊轨迹也是有曲线变化的而不是僵硬的直来直去的话,使用trail算个速度来做的运动模糊是永远做不到这一点的。 这里我想通过常用的火花(spark)的运动模糊来讲一讲我所了解的一些比较好的方法。 所谓渲染中的运动模糊无非就是...