Spring AOP入门——概念及注意点

AOP是什么?

AOP从功能上来说就是在执行某些业务逻辑的前后,可以允许你动态地添加一些操作(比如记录日志、或者是判断是否有权限等),这些操作的添加,完全不耦合于原来的业务逻辑,从而对原有业务逻辑完全是透明。

也就是说,这段操作和业务逻辑是完全分开的,它可能在项目中需要横切多个模块,且其自身也是一个独立的模块,贯穿了整个项目。我们完全可以根据需要启用或者停用这个功能。 AOP的典型应用就是事务管理和日志。

AOP中的概念

下面这些术语并不是Spring定义的。由于AOP中的术语不是那么形象,所以如果Spring再自己定义一套的话那么会使得这些概念更加混淆。

a) 切面(Aspect):一个横切关注点的模块化。在企业级JAVA应用中,事务管理是一个关于横切关注点的典型例子。在Spring AOP中,切面可以用常规类(基于shcema)或者用常规类并加上注解来实现(基于@AspectJ)。

b) 通知(Advice):由切面在特定的连接点执行的动作称为通知。不同类型的通知包括,前置通知、环绕通知、后置通知等。许多AOP框架,包括Spring,把通知模拟成一个拦截器,环绕着连接点维护一个拦截器链。

c) 连接点(JoinPoint):程序运行过程中的一个点,比如说执行方法或者是处理异常。在Spring Aop中,一个连接点总是代表一个方法的执行。

d) 目标对象(Target Object):也就是需要被通知的对象,所以也叫被通知对象(advised object)。由于Spring AOP是用运行时代理来实现的,所以这个对象总是个被代理的对象。

e) AOP代理(AOP proxy):AOP框架创建用来实现实现AOP功能的。在Spring框架中,AOP代理可以基于JDK动态代理,也可以是基于CGLIB的代理。

f) 织入(Weaving):把切面和其它应用类型或者对象来创建一个目标对象。可以在编译期(比如使用 AspectJ编译器),装载阶段或者是运行时完成。正如别的纯Java的AOP框架一样,Spring AOP在运行时实现织入。

通知类型

a) 前置通知(Before advice):在连接点之前执行,但是无法阻止连接点的执行(除非其中抛出异常)

b) 后置返回通知(After returning advice):在连接点正常执行完成后执行,比如一个方法正常返回且没有抛出异常

c) 后置异常通知(After throwing advice):在被通知方法抛出异常后执行

d) 后置通知(After (final) advice):只要连接点执行那就一定会执行,不管是抛出异常还是正常返回

e) 环绕通知(Around advice):这是最强大的通知,它可以实现前置通知和后置通知,并且它还可以来控制①是否执行连接点②返回值③抛异常

环绕通知是最常见的一种通知。Spring AOP像AspectJ一样提供了全范围的通知类型,所以官方文档给出的建议是使用“最弱小”的通知来实现我们的需求,为什么呢?你懂的,杀鸡焉用牛刀,且复杂的东西容易出错。比如,如果你只需要使用方法的返回值更新一下缓存,虽然环绕通知也可以满足这一要求,但使用一个后置返回通知将要比使用一个环绕通知要好。使用最合适的通知类型会让你的编程模型变的简单,从而避免一些潜在的错误。比如,你不需要去调用ProceedingJoinPoint的proceed()方法,因此你不会因为调用它而出错。

连接点的概念和切入点一样,都是AOP的核心。它们让AOP区别于更老的一些只提供拦截器的技术。切入点能把通知指向到目标,而不必局限于OOP的结构。比如,环绕通知可以对那些横跨多个对象的方法(比如服务层的所有业务方法)提供事务管理。

需要注意的地方

1、若存在around,且around未proceed目标方法,那么after则不会被触发

2、若存在around,且proceed目标方法抛出异常,那么proceed之后的语句就不会执行到,而是直接到after or after returing

3、若存在around,且around正常执行,那么around方法的返回值,也就是在after-returning中能够获得的返回值

4、若不存在around,那么after-returning能够获得的返回值就是目标方法执行后的返回值

5、around就算不给返回值,也不会妨碍目标方法的调用,并不像网上说的那样会导致目标方法停止调用并返回null

6、事务是与线程绑定的,若在方法中开启新线程,那么自然独立于先前的事务

Spring AOP入门——概念及注意点

时间: 2024-10-21 12:05:06

Spring AOP入门——概念及注意点的相关文章

Spring AOP基本概念

Spring AOP基本概念 目录 Spring AOP定义 AOP基本术语 通知类型 AOP定义 AOP基本术语 切面( Aspect ):一个能横切多个对象的模块化的关注点.对Spring AOP来说,切面就是普通的类(基于模式)或使用 @Aspect 注解的类. 连接点( Joint Point ):程序执行过程中的某个点.对Spring AOP来说,连接点就是方法的执行. 通知( Advice ):切面在某个连接点上执行的动作. 切入点( PointCut ):匹配连接点的断言. 引入(

spring aop基础概念

spring aop基础概念 1.什么是aop: aspect oriented programming:面向切面编程. 即通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 主要功能是:日志记录,性能统计,安全控制,事务处理,异常处理等. 2.aop的实现方式: (1)预编译:AspectJ (2)运行期动态代理(JDK动态代理.CGLIB动态代理):SpringAOP.JbossAOP 3.aop的概念: (1)切面(aspect):一个关注点的模块化,这个关注点可能会横切多个

Spring -- AOP入门基础

动态代理 我们在日常开发过程中是否会遇到下图中的这种状况 红框中的是我们要输出的日志,你是否发现,日志中大部分信息都是相同的,并且如果我们要修改一个地方,所有的地方都需要改,而且代码看起来还比较冗余 下面我们就可以通过动态代理的方式解决这个问题 看下代码 public interface Calculation { public int add(int x, int y); public int sub(int x, int y); public int mul(int x, int y); p

Spring AOP:概念

什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是软件开发思想发展到一定阶段的产物,但AOP的出现并不是要完全替代OOP,而仅作为OOP的有益补充. AOP是有特定的应用场合的,它只适合那些具有横切逻辑的应用场合,如性能检测.访问控制.事务管理及日志记录等.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的

Spring AOP之概念解释

直入主题,下面对AOP中几个关键的术语进行简单的说明 1)连接点(JoinPoint) 连接点是对程序执行过程中可被织入额外代码的特定点的描述.连接点包含了两个信息,一个是描述代码中定义好的客观存在事物的"位置",例如某个类中的某个属性.方法等.另一个是描述"位置"在执行过程中的某个时刻,例如:属性的初始化前.属性的初始化后.方法执行前.方法执行后等. 如果我们用代码来描述,则可以像下面这样 //方位描述对象 class Location{ //某对象[作用的对象]

Spring AOP入门基础-继承、装饰者,代理的选择

关于Spring AOP,底层是基于动态代理实现的,下面简单的学习下为什么选择动态代理,而不选择继承实现,装饰者模式实现,下面参考如下业务场景下理解. 业务场景 业务层如果有业务需求,需要在注册用户,升级用户,和删除用户方法前都进行一次权限验证,最原始的方法就是在业务层每个方法前都添加代码验证.这是最原始的方式,在实际业务中有很多的方法,那都需要重写修改,很显然这是不合理的,因此衍生如下几个解决方案: (1)使用继承类,在继承类中对继承的方法进行修改,参考DogDemo01 (2)使用装饰者模式

Spring AOP 入门

引言 AOP是软件开发思想发展到一定阶段的产物,AOP的出现并不是为了代替OOP,仅作为OOP的有益补充,在下面的例子中这个概念将会得到印证.AOP的应用场合是受限制的,一般适用于那些具有横切逻辑的应用场合,例如性能监测,访问控制,事务管理,日志记录.在平常的应用开发中AOP很难被使用到,但是AOP是Spring的亮点之一,有必要一看. 一 AOP以及术语 AOP是Aspect Oriented Programing的简称,被译为面向切面编程.AOP希望将散落在业务逻辑函数中的相同代码抽取到一个

Spring学习总结(1)——Spring AOP的概念理解

1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得 很多人都和我说aop多难多难 .当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不 离其宗而已. 2.为什么用aop 1就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序做了.用了aop能让你少写很多代码,这点就够充分了吧 2就是为了更清

spring aop入门

一.何为AOP? spring 的两大核心思想无非是 IOC和AOP.那么Spring 的 aop 是神马意思呢?AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现. 二.有何用途? 主要用于将日志记录,性能统计,安全控制