Spring AOP实现原理(一)AOP简介

前言

Spring AOP是Spring众多优秀特性中的一个,我一直对它的实现比较好奇,最近有些闲暇时间,就整理了一些有关Spring AOP实现的资料。在整理的过程当中,又稍做深刻的理解一些优秀的框架和工具,好比asm,CGLIB,AspectJ等,顿觉本身知识浅薄,固然也难以抑制分享的冲动,因而就决定作一个系列文章——Spring AOP实现原理。html

文章总共分为5部分:spring

  1. AOP简介编程

  2. 实现一个简单的AOP缓存

  3. 动态代理:JDK Proxy 和 CGLIBbash

  4. Spring AOP特性解读框架

  5. Spring AOP源码解析eclipse

笔者认为重点是3和5,这两部分针对实现原理作了深刻的探讨,有必定基础的同窗建议直接阅读重点部分。ide

AOP简介

AOP是什么

aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development.

Wiki对AOP的定义,AOP是一种编程范式,目的是为了将跨领域的关注点分离出来以达到模块化。它能够向现存代码中增长行为逻辑而不用修改原有代码,它是经过指定切入点(pointcut)来实现的,例如向以set为开头的函数(function)中增长日志功能。它能够实现将一些不是核心的业务逻辑(如日志等)添加到程序中,而不会使核心代码混乱。AOP为面向方面的软件开发奠基了基础。模块化

从定义中,咱们提取几个关键字:函数

  • 编程范式,和面向对象编程相似,AOP也是一种编程范式,它是面向切面编程
  • 模块化,将程序模块化是AOP的追求目标
  • 非核心业务逻辑,AOP应用于日志、监控等这种非核心业务中

咱们以一个简图来讲明:

从图中能够看出,业务A和业务B中都有log业务,面向切面的编程思想就将这些log业务从主业务中剥离出来,单独造成一个切面(Aspect),而后在切面中进行处理(Advice).

AOP中有哪些概念

咱们以AspectJ的接入点模型(join-point model)为例,说明一下AOP中的概念

  • 接入点(Join Point):方法调用,构造器调用,初始化class,实例化对象,成员变量的读写,异常处理等均可以成为接入点

  • 切点(PointCuts):表明了一些接入点(Join Point)的集合,好比:

    execution(* set*(*))
    复制代码

    以方法接入点为示例,表达式表明了匹配以set为开头而且只有一个参数的方法

  • Advice:指的能够在接入点的前(before),中(around),后(after)执行的代码

  • 切面(Aspect):切面像是一个抽象出来的类,它不只融合了以上的元素,它也能够包含本身的属性,方法等,固然,切面也能够被实例化。在Spring AOP中,切面的应用较为简单,为了便于理解,咱们能够把切面理解为一个实现具体业务的类,例如计算Dao层方法执行时间的类。

注:AspectJ中的AOP实现比Spring AOP复杂的多,本文主要以理解Spring AOP为目的,不作深刻的探讨,有兴趣进一步学习的同窗能够参考附件中的AspectJ的官方文档

AOP的应用场景

前面咱们提到AOP主要应用一些非核心业务逻辑中,咱们看看AOP常见的应用场景

  • 监控
  • 日志
  • 缓存
  • 鉴权
  • 事务
  • 异常处理
  • 持久化

引用资料

Wiki:en.wikipedia.org/wiki/Aspect…

AspectJ:www.eclipse.org/aspectj/doc…

Spring AOP:docs.spring.io/spring/docs…

相关文章
相关标签/搜索