前文的一些内容更多是针对Spring容器内部的一些特性的描述,接下来一个专题将描述Spring AOP的一些信息,配置细节等等。

介绍

面向切面编程(AOP)是一种新的针对程序结构的思路,它补足了面向对象编程(OOP)的一些细节上的不足。OOP的关键在于模块化概念,也就是Java中的class。而AOP关心的模块则是切面。切面关心的模块化主要是考虑的是诸如事物管理这类会跨越多个类型和对象的一些方面。(而这些类型对象通常是在多个不同业务层的。)

Spring的其中一个核心组件也就是AOP框架。而Spring IoC容器并不依赖AOP,也就是说,开发者如果不想使用AOP,就可以不使用AOP,AOP以一种中间件的方式补足了Spring IoC的功能。

Spring 2.0 AOP
Spring 2.0引入了一种既简单又有效的方式来支持定制切面,无论是使用基于契约(XML)的方式,还是基于@AspectJ注解的方式。两种方式都是支持AOP的全部功能的。
之后的AOP系列会将针对两种方式分别讨论。Spring 2.0 AOP是完全兼容之前的Spring 1.2 AOP的。后续AOP系列也会讨论AOP的相关API。

AOP在Spring框架中起的作用主要有两点:

  • 提供显式声明的企业服务,尤其是用来替换EJB服务的情况。其中最重要的服务就是诸如事务管理之类的服务。
  • 允许用户来实现定制的切面,使用AOP来补足OOP的不足。

AOP 基本概念

首先,我们来看下AOP的核心概念以及相关术语。这些术语并不是Spring特有的。很可惜的是,AOP的术语不是很直观,尤其是在Spring使用它自己的术语的时候很令人疑惑。

  • Aspect:一个横切多个类的模块化的服务。事物管理就是一个很好的例子,在企业应用当中,他会跨越很多的模块。在Spring的AOP中,切面是通过一般的类来实现(基于契约的方式)或者通过注解了@Aspect注解的一般类来实现(@AspectJ方式)。
  • JoinPoint:程序的一个执行点,比如一个方法的执行,或者是处理一个异常。在Spring AOP中,JoinPoint总是代表折方法的执行过程。
  • Advice:JoinPoint过程中的一些动作。包括aroundbefore以及after这几种类型的Advide。很多的AOP框架,包括Spring,都会将Advide作为一个interceptor(拦截器),保证在一个JoinPoint有一个拦截链。
  • Pointcut:判定是否匹配JoinPoint,Advide是和Pointcut表达式关联的,只有在Pointcut匹配的时候,才会运行在JoinPoint上面(举例来说,匹配一个方法的名字)。JoinPoint的概念和Pointcut表达式匹配是AOP中最重要的概念,默认情况下,Spring使用AspectJ的Pointcut表达式语言。
  • Introduction:声明额外的方法或者私有变量来代表一个类型。Spring AOP允许开发者来引入新的接口(以及对应的实现类)到切面对象上。举例来说,开发者可以通过使用Introduction,令Bean来实现IsModified接口,来简化缓存(Introduction作为AspectJ中的内在声明类型)。
  • TargetObject:由切面切入的对象就是TargetObject。也称之为advised对象。因为Spring AOP是通过实时代理来实现的,这个对象将总是一个代理的对象。
  • AOP proxy:为了实现切面约束而由AOP框架创建的对象就是AOP proxy。在Spring框架中,AOP的代理就是JDK动态代理或者CGLIB代理。
  • Weaving:和应用其他类型连接的切面,或者是创建的Advice对象的过程。这一过程可以在编译期(使用AspectJ编译器),加载期,或者运行时完成。Spring AOP和其它的纯Java的AOP框架一样,是在运行时执行Weaving过程的。

Advice的类型

  • Before Advice: 在JoinPoint执行之前执行的Advice,但是不能够阻止JoinPoint的执行,除非抛出异常。
  • After Returning Advice:在JoinPoint正常完成的情况下执行的Advice,简单来说,就是一个方法没有抛出异常。
  • After Throwing Advice:在JoinPoint不正常完成的情况下执行的Advice,简来单说,就是方法抛出异常的时候执行的Advice。
  • After(finally) Advice:无论一个JoinPoint执行正常还是非正常,都会执行的Advice。
  • Around Advice:以一层调用包裹了JoinPoint的Advice,这是最常见,最有效的一种Advice。Around Adivce可以执行定制的行为,无论是在方法的执行之前还是执行之后。Around Advice也负责决定是否开始进入JoinPoint或者是执行方法其他方法来返回或者抛出异常。

Around Advice也是最泛化的一种Advice。但是Spring AOP中,像AspectJ都提供了很多不同类型的Advice,所以我们仍然建议开发者少使用Around Advice,而是使用最合适的Advice来实现特定的行为。举例来说,如果开发者只需要更新一个缓存来返回方法的值,那么实现一个Returning Advice就比Around Advice更好,尽管Around Advice也能够实现同样的功能。使用更为具体的Advice类型可以简化变成的模型,去除一些潜在的错误。举例来说,开发者在Around Advice上不需要在JoinPoint上调用proceed()方法,一旦调用就可能产生错误。

在Spring 2.0的版本中,所有的参数都是静态的定义的,所以当开发者使用Advice的参数的时候,可以使用适当的类型而不是Object的数组。

JoinPoint的执行和PointCut的匹配概念,是AOP区别于老的的拦截技术的关键。PointCut使得Advice可以独立于面向对象层次来执行。举例来说,一个提供显式的事务管理的Around Advice可以用于多个对象,跨越多个不同的服务层级而工作。

Spring AOP的能力和目的

Spring AOP是纯Java实现的。不需要其他特殊的处理。Spring AOP也不需要控制类加载的层次,所以在应用服务器或者是Servlet容器中应用都很方便。

Spring AOP 当前只支持方法执行的JoinPoint(基于Spring Bean方法的Advice执行),实例变量的拦截是不支持的,尽管支持这个功能也不会破坏掉Spring AOP核心的API。如果开发者需要针对实例变量的访问和更新JoinPoint的话,可以考虑使用AspectJ语言。

Spring AOP框架和其他的AOP框架细节上还是有些不同的。Spring的目的不是为了支持最完整的AOP实现(尽管Spring AOP功能很完善),Spring AOP更多关心的是提供AOP和Spring IoC的集成,以便能够解决企业级应用的常见问题。

比如,Spring框架的AOP功能通常都是结合Spring IoC容器来使用的。切面的配置,也基本都是使用Bean定义的语法(当然Spring AOP也支持强大的自动代理的能力),这就是和其它AOP实现的一个最大的不同。当然,使用Spring AOP也会有一些限制,比如Advice一些细粒度的对象(比如域对象之类的)很难:如果AOP面对的常见问题多数是这种情况的话,使用AspectJ可能是更好的选择。当然,Spring团队的经验是,Spring AOP对绝大多数的企业应用场景,都是十分适用的。

Spring AOP不会努力去实现所有AspectJ的功能以提供完整的AOP解决方案。我们相信无论是基于代理的框架像Spring AOP或者是成熟的AOP框架,比如AspectJ都是十分有价值的,并且他们是相互补充的关系,而并非竞争的关系。Spring通过AspectJ无缝地集成了Spring AOP和IoC,使得所有基于Spring的应用架构能够方便的集成AOP。这种集成不会影响Spring AOP的API或者AOP联盟的API:Spring AOP仍然保持向后兼容。

Spring框架的核心原则之一就是non-invasiveness(轻量级),这一概念的意思就是开发者不必强制引入一些框架的类和接口到应用的业务层或者是模型层。当然,有的时候,Spring框架也支持开发者引入框架的特定依赖:之所以Spring提供这样的支持,是因为在某些场景下,使用Spring框架的特定类能更简单的实现这些功能。Spring框架(几乎)总会提供这样的选择。开发者可以自由选择是否需要使用来最佳的贴合实际的应用场景。
开发者还可以根据自己的场景来使用不同的AOP框架。开发者使用AspectJ或者Spring AOP都是没有问题的,亦或是使用@AspectJ注解的方式,或者是Spring XML配置的方式,都可以。本章更多介绍的是@AspectJ的方式,是因为Spring团队更偏好基于注解的方式。

AOP 代理

Spring AOP默认情况下是使用标准的JDK 动态代理来作为AOP的代理的,它可以使得任何接口被代理。

Spring AOP也可以使用CGLIB代理。这种代理更多的是代理类,而不是接口。CGLIB默认情况下,是当一个业务对象没有实现接口的时候,来代理的。当然,好的编程习惯肯定最好是基于接口的。业务类通常也会实现多个业务接口。当然,强制使用CGLIB作为代理也是可以的。但是在那种情况下,开发者需要声明方法为并非实现接口的方法,或者需要传递一个代理对象到方法作为具体的类型。

理解Spring AOP是基于代理实现的是非常重要的。在后续的文章中可以看到具体的例子。

Spring AOP(一)——基础概念相关推荐

  1. 我所理解的Spring AOP的基本概念

    Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了很多例子后,写一些自己理解的一些spring的概念.要理解面向切面编程,要首先理解代理模式和动态代理模式. 假设一个OA系统中的一个功 ...

  2. Spring AOP的一些概念

            切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子. 在Spring AOP中,切面可以使用通用类(基于模 ...

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

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

  4. Spring Aop基础使用

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

  5. 从AOP到Spring AOP

    文章目录 一.前言 二.AOP基础知识 2.1 AOP 2.1.1 引子:AOP,AOP是什么? 2.1.2 使用对比的方式理解AOP--AOP与OOP 2.1.3 使用对比的方式理解AOP--静态A ...

  6. Spring AOP 学习笔记

    Spring 的AOP AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在Java EE应用中,常常通过AOP 来处理一些具有横切性质的系统级服务,如事务管理.安全检查.缓存 ...

  7. 从代理机制到Spring AOP

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  8. 从代理机制到Spring AOP,这篇给你安排的明明白白的

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  9. 设计模式:代理模式是什么,Spring AOP还和它有关系?

    接着学习设计模式系列,今天讲解的是代理模式. 定义 什么是代理模式? 代理模式,也叫委托模式,其定义是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.它包含了三个角色: Subject: ...

  10. 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?

    Hi! 我是小小,我们又见面了,今天的主要内容是,你真的了解Spring AOP的执行顺序吗?跟随着我的脚步,一块丈量世界,了解世界,重新认识,重新了解Spring AOP的执行顺序. 聊一聊毕业四个 ...

最新文章

  1. Python如何在以数字命名的文件前补0
  2. 数据结构与算法:19 排序
  3. linux管理子进程c,Linux 进程管理 CGroup
  4. 剑桥加密资产研究的主要发现 金评媒JPM 09-19 00:00 金评媒(https://www.jpm.cn)编者按:研究发现,全球有 1876 人在加密资产行业中工作。其中最多的是在亚太地区工作,
  5. MPL,MIL和MCL
  6. Redis的List操作
  7. redis使用sysc超时_基于redis的分布式锁实现
  8. Hbase(3)——desc、alter、时间戳
  9. 数据挖掘、机器学习书籍推荐!!
  10. 面向对象方法使用gluon
  11. EDAS再升级!全面支持Spring Cloud应用
  12. promise基础学习记录
  13. webservice第一篇【介绍、Scoket、http调用、wsimport调用】
  14. Windows下搭建Android开发环境
  15. 设置windows引导linux分区,windows下安装grub引导Linux
  16. 23种经典设计模式的java实现_5_职责链模式
  17. 编译opencv错误解决:libavcodec.a(hevc_cabac.o): `ff_h264_cabac_tables' can not be used
  18. IDC中国大型企业SaaS云服务市场:金蝶位居第一
  19. python蒙特卡洛方法圆周率_使用Python语言的蒙特卡洛方法计算圆周率π的一种实现...
  20. 694.27公斤何登骥360搜索热头条 北方旱作国稻种芯功能水稻

热门文章

  1. SSH配置密钥登录时需要注意私钥是否设置了密码(passphrase)
  2. 九九重阳--杭州国际烟花节看烟花
  3. Datawhale 零基础入门数据挖掘心跳信号分类学习反馈02
  4. Hive高级、Hive的元数据
  5. [Hive的DDL学习]
  6. Task05:模型建立和评估
  7. 大话设计模式学习笔记(6)——装饰模式
  8. 使用Python,Opencv检测AprilTag
  9. 解决Selenium WebDriver 加载页面时出现浏览器闪退
  10. 分享我的vim配置文件