Spring AOP(通知、连接点、切点、切面)

一、AOP术语

  1. 通知(Advice)
      切面的工作被称为通知。通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
    5种通知类型:

前置通知(Before):在目标方法被调用之前调用通知功能
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知(After-returning):在目标方法成功执行之后调用通知
异常通知(After-throwing):在目标方法抛出异常后调用通知
环绕通知(Around):通知包裹了被通知的方法,在被通知的方
法调用之前和之后执行自定义的行为

后置通知和返回通知的区别是,后置通知是不管方法是否有异常,都会执行该通知;而返回通知是方法正常结束时才会执行。

  1. 连接点(Join point)
      连接点是在应用执行过程中能够插入切面的一个点。
  2. 切点(Pointcut)
      一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所通知的连接点范围。如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。因此,切点其实就是定义了需要执行在哪些连接点上执行通知。
  3. 切面(Aspect)
      切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和在何处完成其功能。
  4. 引入(Introduction)
      引入允许我们向现有的类添加新方法或属性。
  5. 织入(Weaving)
      织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有很多个点可以进行织入:

编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入就支持这种方式织入切面。
运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。

二、Spring对AOP的支持

  创建切点来定义切面所织入的连接点是AOP框架的基本功能。Spring提供了4种类型的AOP支持:

  • 基于代理的经典Spring AOP;
  • 纯POJO切面
  • @AspectJ注解驱动的切面
  • 注入式AspectJ切面(适用于Spring各版本)

前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

1.Spring在运行时通知对象

通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理的bean中。如下图所示,代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用时,在调用目标bean方法之前,会执行切面逻辑。

直到应用需要被代理的bean时,Spring才创建代理对象。如果使用的是ApplicationContext的话,在Applicationcontext从Beanfactory中加载所有bean的时候,Spring才会创建被代理的对象。因为Spring运行时才创建代理对象,所以我们不需要特殊的编译器来织入Spring AOP的切面。

2.Spring只支持方法级别的连接点

因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些其他的AOP框架是不用的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。

三、通过切点来选择连接点

以下是Spring AOP所支持的AspectJ切点指示器

AspectJ指示器描述
arg()限制连接点匹配参数为指定类型的执行方法
@args()限制连接点匹配参数由指定注解标注的执行方法
execution()用于匹配是连接点的执行方法
this()限制连接点匹配AOP代理的bean引用为指定类型的类
target限制连接点匹配目标对象为指定类型的类
@target限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解
within()限制连接点匹配指定的类型
@within()限制连接点匹配指定注解所标注的类型(当使用Spring AOP时,方法定义在由指定的注解所标注的类里)
@annotation限定匹配带有指定注解的连接点
    1. 编写切点

      2.定义切面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中几种常用的集合的用法

集合:将一推数据类型相同的数据放入到一个容器内,该容器就是数组:内存中开辟的一连串空间。 非泛型集合 ArrayList集合: ArrayList是基于数组实现的,是一个动态数组,其容量能自动 增长 ArrayList的命名空间System.…

C#使用Redis的基本操作

一&#xff0c;引入dll 1.ServiceStack.Common.dll 2.ServiceStack.Interfaces.dll 3.ServiceStack.Redis.dll 4.ServiceStack.Text.dll 二&#xff0c;修改配置文件 在你的配置文件中加入如下的代码&#xff1a; <appSettings><add key"RedisPath" value…

Navicat将mysql表结构导成oracle表结构

1&#xff0c;选中对应的表右键逆向表到模型 2.点击右上角文件转换模型为 3.模型选择物理&#xff0c;数据库oracle&#xff0c;选择对应的版本 4.新弹出的模型点击右上角文件&#xff0c;导出sql 5.选择路径导出sql

程序员们的三高:高并发、高性能、高可用

你们知道淘宝&#xff0c;京东这些购物商场吗&#xff1f;他们到了双11&#xff0c;双12为什么能支持全国14亿人口同时购物下单呢&#xff0c;因为他们的程序做到了高并发、高性能、高可用。那么你对程序员的三高了解多少呢&#xff1f; 高并发 一. 高并发 高并发是现在互联…

char 和 varchar 的区别,数据库索引B+树

char 和 varchar 的区别 char(n) &#xff1a;固定长度&#xff0c;效率高&#xff1b;缺点&#xff1a;占用空间&#xff1b;存储固定长度的&#xff0c;使用 char 非常合适。 varchar(n) &#xff1a;可变长度&#xff0c;存储的值是每个值占用的字节再加上一个用来记录其长…

C#基础操作符详解

本节内容&#xff1a; 1.操作符概览&#xff1b; 2.操作符的本质&#xff1b; 3.操作符与运算顺序 4.操作符详解。 1.操作符概览&#xff1a; 操作符&#xff08;Operator&#xff09;也译为”运算符” 操作符是用来操作数据的&#xff0c;被操作符操作的数据称为操作数&a…

C# 有什么惊艳到你的地方?

作者&#xff1a;皮皮关 链接&#xff1a;https://www.zhihu.com/question/335137780/answer/786853293 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 很多游戏开发者都是由于Unity而“被迫”使用C#的。但用过一段…

SqlServer学习之存储过程

前言&#xff1a;对于存储过程一直有一种抵触的心理&#xff0c;因为毕业至今所在的公司开发组都不是很规范&#xff0c;对于开发的一些注意事项并没有很多的规定&#xff0c;只是在知乎上查找相关知识的时候&#xff0c;看到很多人对于在程序里使用存储过程的不好之处都有很多…

中间件之RPC

一、RPC的定义 1、RPC(Romote Procedure Call)&#xff1a;远程过程调用&#xff0c;允许一台计算机程序远程调用另外一台计算机的子程序&#xff0c;不用关心底层网络通信 2、应用&#xff1a;分布式网络通信 3、在Socket的基础上实现&#xff0c;比socket需要更多资源 4、…

需求分析之UML用例图学习

用例图常用的三种关系浅析&#xff1a; &#xff08;一&#xff09;泛化(Inheritance) 通常理解的继承关系 &#xff08;二&#xff09;包含&#xff08;include&#xff09; 分解功能&#xff0c;一定包含的功能 &#xff08;三&#xff09;拓展(extend) 附加功能&#xff0c…

UML之用例图(use case)箭头方向

1、Association&#xff0c;无箭头&#xff0c;Actor连接UseCase即可&#xff1b; 2、DirectedAssocition&#xff0c;Actor连接UseCase&#xff0c;箭头由Actor指向UseCase&#xff08;角色指向用例&#xff09;&#xff1b; 3、Generalization&#xff0c;继承&#xff0c;…

UML-记忆技巧

箭头方向 UML箭头方向&#xff1a;从子类指向父类&#xff0c;读作继承自定义子类时需要通过extend关键字指定父类子类一定时知道父类定义的&#xff0c;但父类并不知道子类的定义 只有知道对方信息时才能指向对方 image.png 实现-继承|虚线-实现 空心三角箭头&#xff1…

国密算法SM2,SM3,SM4-java实现

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法&#xff0c;基于ECC。其签名速度与秘钥生成速度都快于RSA&#xff0c;非对称加密&#xff0c;该算法已公开 SM3是中华人民共和国政府采用的一种密码散列函数标准&#xff0c;由国家密码管理局于2010年12月17日…

数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

一、数据库事务隔离级别 数据库事务的隔离级别有4个&#xff0c;由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable &#xff0c;这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现 : 不会出现 脏读不可重复读幻…

原子性和一致性的区别是什么?

注&#xff1a; 重度参考了&#xff1a;https://www.zhihu.com/question/30272728/answer/72476703&#xff08;讲的非常好&#xff0c;逻辑清晰&#xff09; 轻度参考了&#xff1a;https://www.cnblogs.com/fjdingsd/p/5273008.html&#xff08;概念也比较清晰&#xff0c;…

什么是事务、事务特性、事务隔离级别、spring事务传播特性

1.什么是事务&#xff1a; 事务是指程序中的一个操作序列。其特点是&#xff1a;该序列的所有操作要么全部成功完成&#xff0c;要么只要有一个操作失败&#xff0c;则该序列所有操作都将被撤销。这也是事务的原子性&#xff08;要么成功&#xff0c;要么失败&#xff09;。 …

软件工程 – 开发模型

软件工程 – 开发模型 为了指导软件开发&#xff0c;可以用不同的方式将软件生命周期中的所有开发活动组织组织起来从而形成不同的开发模型。 瀑布模式 瀑布模型严格遵守软件生命周期各阶段的固定顺序:计划、分析、设计、编程、测试和维护&#xff0c;上一阶段完成才能进入到…

排序算法之选择排序

动图演示 使用场景:适用于大多数排序,数据量大效率明显优于冒泡 java代码实现 import java.util.Arrays;/*** 选择排序*/ public class SelectSort {private static int[] selectSort(int[] arr) {if (arrnull||arr.length<2){return arr;}//控制循环次数,最后一个元素不用…

VS的包含目录、库目录、引用目录、可执行目录解释

来源&#xff1a;包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解 学习备份 VS项目中的包含目录、库目录、附加包含目录、附加库目录、附加依赖项均在”项目->属性->配置属性”下进行配置&#xff0c;具体说明如下&#xff1a; VC目录&#xff1a; 包含目…

排序算法之插入排序

动图演示 使用场景:数据有序程度越高,效率越高 java代码实现 import java.util.Arrays;/*** 插入排序*/ public class InsertSort {private static int[] insertSort(int[] arr) {if (arrnull||arr.length<2){return arr;}// 从下标为1的元素开始选择合适的位置插入&…