软件开发中,分布于应用中多处的功能被称为横切关注点,比如日志、安全和事务管理。这些横切关注点从概念上是与应用的业务逻辑相分离的,但是往往又直接嵌入到应用的业务逻辑中。将这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的。
       依赖注入有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。

横切关注点可以被模块化为特殊的类,这些类被称为切面。这样做有两个好处:首先,每个关注点现在都只集中于一处,而不是分散到多处代码中;其次,服务模块更简洁,因为它们只包含主要关注点(或核心功能)的代码,而次要关注点的代码被转移到切面中了。

1.AOP术语:

>.通知(Advice):在AOP中,切面的工作被称为通知
       通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring切面可以应用5种类型的通知:
       (1)Before---在方法被调用之前调用通知;
       (2)After---在方法完成之后调用通知,无论方法执行是否成功;
       (3)After-returning---在方法成功执行之后调用通知;
       (4)After-throwing---在方法抛出异常后调用通知;
       (5)Around---通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

>.连接点(Joinpoint):连接点是在应用执行过程中能够插入切面的一个点
这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。

>.切点(Poincut):一个切面并不需要通知应用的所有连接点。切点有助于缩小切面所通知连接点的范围。
切点的定义会匹配通知所要织入的一个或多个连接点。通常使用明确的类和方法名来指定这些切点,或是利用正则表达式定义匹配的类和方法名称模式来指定这些切点。

>.切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了关于切面的全部内容---它是什么,在何时和何处完成其功能。

>.引入(Introduction):引入允许我们向现有的类添加新方法或属性。

>.织入(Weaving):织入是将切面应用到目标对象来创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
       (1)编译期---切面在目标类编译时被织入。需要特殊编译器。AspectJ的织入编译器就是以这种方式织入切面的。
       (2)类加载期---切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强目标类的字节码。
       (3)运行期---切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。Spring AOP就是以这种方式织入切面的。

2.Spring对AOP的支持

创建切点来定义切面织入的连接点是AOP框架的基本功能。
       目前的AOP框架主要有:
        >.AspectJ(http://eclipse.org/aspectj);
        >.JBoss AOP(http://www.jboss.org/jbossaop);
        >.Spring AOP(http://www.springframework.org)。
        Spring提供了4中各具特色的AOP支持:
        >.基于代理的经典AOP;
        >.@AspectJ注解驱动的切面;
        >.纯POJO切面;
        >.注入式AspectJ切面(适合Spring各版本)。

Spring通知是Java编写的。Spring在运行期通知对象:
        通过在代理类中包裹切面,Spring在运行期将切面织入到Spring管理的Bean中。

如上图所示,代理类封装了目标类,并拦截被通知的方法的调用,再将调用转发给真正的目标Bean。
       当拦截到方法调用时,在调用目标Bean方法之前,代理会执行切面逻辑。直到应用需要被代理的Bean时,Spring才创建代理对象。如果使用的是ApplicationContext,在ApplicationContext从BeanFactory中加载所有Bean时,Spring创建被代理的对象。因为Spring运行时才创建代理对象,所以不需要特殊的编译器来织入Spring AOP的切面。由于Spring基于动态代理,因此Spring只支持方法连接点。如果需要方法拦截之外的连接点拦截,可以利用AspectJ来协助Spring AOP。

3.使用切点选择连接点

在Spring AOP中,使用AspectJ的切点表达式语言来定义切点。Spring仅支持AspectJ切点指示器的一个子集。

在Spring中尝试使用AspectJ其他指示器时,会抛出IllegalArgumentException异常。另外,上述指示器中,只有execution指示器是唯一的执行匹配,其他的都是用于限制匹配的。这说明,execution指示器是我们编写切点定义时最主要使用的指示器。在此基础上,使用其他指示器来限制所匹配的切点。

上面我们使用"&&"把execution和within指示器连在一起形成与关系,同样,可以使用"||"来表示或关系,使用"!"表示非关系。

除了上面的指示器意外,Spring2.5引入了新的bean()指示器,使用该指示器,我们可以在切点表达式中使用Bean的ID来标识Bean。

eg.

execution(*  com.springaction.aop.domain.Perfomer.perform(..)) and bean(duke)

上面的例子中,在执行 Perfomer 的 perform方法时应用通知,但限定Bean的ID为duke。

4.在XML中声明切面

5.注解切面

使用注解创建切面是AspectJ 5引入的关键特性。使用AspectJ面向注解的模型可以非常简便的通过少量注解将人以类转变为切面。

6.注入AspectJ切面

虽然Spring AOP能满足许多应用的切面需求,但与AspectJ相比,Spring AOP扔是一个功能比较弱的AOP解决方案。AspectJ提供了Spring AOP所不能支持的许多类型的切点。

下节会给出具体的配置demo。

以上内容主要来自《Spring in action》的读书笔记。

Spring AOP---基础简介相关推荐

  1. Spring AOP基础组件 Pointcut

    相关阅读 Spring AOP基础组件 Advice Spring AOP基础组件 Advisor 简介 定义了切面的匹配点,即哪些类的哪些方法:在Spring AOP中匹配点主要是class(Cla ...

  2. Spring AOP基础组件 Advisor

    相关阅读 Spring AOP基础组件 Pointcut Spring AOP基础组件 Advice 简介 持有AOP Advice和决定Advice适用性的过滤器(比如Pointcut)的基础接口: ...

  3. Spring AOP基础组件 Joinpoint

    相关阅读 Spring AOP基础组件 Pointcut Spring AOP基础组件 Advice Spring AOP基础组件 AopProxy 简介 Joinpoint表示通用的运行时连接点: ...

  4. 了解动态代理:Spring AOP基础

    为什么选择AOP: 要了解AOP(面向方面​​的编程),我们需要了解软件开发中的"横切关注点". 在每个项目中,都有一定数量的代码在多个类,多个模块中重复执行,例如几乎所有类和所有 ...

  5. SSM框架笔记10:Spring AOP基础

    Spring AOP基础   AOP:Aspect-Oriented Programming 面向切面编程.   Spring的AOP作用在于解耦.AOP让一组类共享相同的行为(比如事务管理.日志管理 ...

  6. Spring Aop基础使用

    说到Spring,想必大家一定就马上想到了,哦Spring不就是帮助管理Bean对象,封装数据源,提供事务管理的东西么.的确,平常在使用Spring的时候,用到最多的就是Spring提供的这些功能了, ...

  7. Spring AOP知识点简介

    文章目录 1.什么是AOP 1.1.AOP术语 1.2.AOP框架 2.动态代理 2.1.JDK动态代理 2.2.CGLIB动态代理 3.基于代理类的AOP实现 3.1.Spring的通知类型 3.2 ...

  8. Spring框架学习笔记05:Spring AOP基础

    文章目录 一.Spring AOP (一)AOP基本含义 (二)AOP基本作用 (三)AOP与OOP (四)AOP使用方式 (五)AOP基本概念 任务:骑士执行任务前和执行任务后,游吟诗人唱赞歌 (一 ...

  9. spring boot基础简介

    一.    创建方式 1.1  spring initializer 可以在IDE中安装springinitializer插件,选择SDK和输入URL,选择需要依赖的模块即可自动创建工程. 1.2   ...

  10. Spring AOP基础—JDK动态代理

    JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类 ...

最新文章

  1. php单元测试断言方法
  2. UNICODE转多字节
  3. Node.js入门经典 读书笔记(3)
  4. pku1401 Factorial 计算n!末尾有几个0?
  5. python列表 行列选择_Python第七课——如何选取excel表格的行数据和列数据
  6. A new start!
  7. 新闻 | 聚焦技术领域现状与发展阿里巴巴知识图谱专场亮相云栖大会 阿里知识图谱亮相云栖大会产学深度交流推进业务创新
  8. php 验证ajax提交表单提交表单提交,使用AJAX表单提交将表单数据传递给PHP而不刷新页面...
  9. python如何写一个图片进去_python写个图片爬虫
  10. Java设计模式--解释器模式
  11. 使用PostBackUrl属性实现跨页面传值
  12. 举报入口_违法和不良信息举报中心
  13. Nuxt项目支持import写法的最新解决方案
  14. 【NOI2001】【Vijos1531】食物链(并查集拓展域)
  15. python中re是什么库_Python正则表达式和re库知识点总结
  16. (安徽省地图)行政区划图高清矢量cdr|pdf(详细版2021年)
  17. 在线作图|如何绘制一张气泡图
  18. [编程题]山寨金闪闪 (面试题)
  19. CDN是什么?以及CDN的原理
  20. ZYNQ学习笔记PS部分【基本介绍】

热门文章

  1. 淘小铺是什么?为什么一夜火爆朋友圈
  2. SPDK简介(其与Ceph rbd的关系)
  3. html css js题目
  4. MEM/MBA数学强化(07)几何
  5. 校园网的实现 java_北科校园网开机自动登录的JAVA实现(已修正)
  6. 成都天瑞地安:零基础学Java最快捷的7个计划
  7. The Physical Layer
  8. Flutter返回页面时刷新页面
  9. 网络操作系统及配置管理课程
  10. CMU 15-445 数据库课程第五课文字版 - 缓冲池