1.1 什么是 AOP ?

AOP 的全称是 “Aspect Oriented Programming”,即面向切面编程

在 AOP 的思想里面,周边功能(比如性能统计,日志,事务管理等)被定义为切面,核心功能和切面功能分别独立进行开发,然后把核心功能和切面功能“编织”在一起,这就叫 AOP。

AOP 能够将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

1.2 AOP 基础概念

  • 连接点(Join point):能够被拦截的地方,Spring AOP 是基于动态代理的,所以是方法拦截的,每个成员方法都可以称之为连接点;
  • 切点(Poincut):每个方法都可以称之为连接点,我们具体定位到某一个方法就成为切点;
  • 增强/通知(Advice):表示添加到切点的一段逻辑代码,并定位连接点的方位信息,简单来说就定义了是干什么的,具体是在哪干;
  • 织入(Weaving):将增强/通知添加到目标类的具体连接点上的过程;
  • 引入/引介(Introduction):允许我们向现有的类添加新方法或属性,是一种特殊的增强;
  • 切面(Aspect):切面由切点和增强/通知组成,它既包括了横切逻辑的定义、也包括了连接点的定义。

上面的解释偏官方,下面用“方言”再给大家解释一遍。

  • 切入点(Pointcut):在哪些类,哪些方法上切入(where);
  • 通知(Advice):在方法执行的什么时机(when:方法前/方法后/方法前后)做什么(what:增强的功能);
  • 切面(Aspect):切面 = 切入点 + 通知,通俗点就是在什么时机,什么地方,做什么增强;
  • 织入(Weaving):把切面加入到对象,并创建出代理对象的过程,这个由 Spring 来完成。

5 种通知的分类:

  • 前置通知(Before Advice):在目标方法被调用前调用通知功能;
  • 后置通知(After Advice):在目标方法被调用之后调用通知功能;
  • 返回通知(After-returning):在目标方法成功执行之后调用通知功能;
  • 异常通知(After-throwing):在目标方法抛出异常之后调用通知功能;
  • 环绕通知(Around):把整个目标方法包裹起来,在被调用前和调用之后分别调用通知功能。

 

aop工作流程:

 

 

第一块就是前置处理,我们在创建 Louzai Bean 的前置处理中,会遍历程序所有的切面信息,然后将切面信息保存在缓存中,比如示例中 LouzaiAspect 的所有切面信息。

第二块就是后置处理,我们在创建 Louzai Bean 的后置处理器中,里面会做两件事情:

  • 获取 Louzai 的切面方法:首先会从缓存中拿到所有的切面信息,和 Louzai 的所有方法进行匹配,然后找到 Louzai 所有需要进行 AOP 的方法。
  • 创建 AOP 代理对象:结合 Louzai 需要进行 AOP 的方法,选择 Cglib 或 JDK,创建 AOP 代理对象。

     

     第三块就是执行切面,通过“责任链 + 递归”,去执行切面。

 

他其中的责任链是通过数组遍历实现的。责任链一般会有一个next对象,当next执行到最后一个或者中途出了问题就会退出。但因为aop中的next对象是不同类型的,所以巧妙的放在了数组中。

原文地址:http://www.cnblogs.com/gujiajie/p/16825298.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性