Spring AoP 详解

目录

    • 一、概述
    • 二、Spring AOP 和 AspectJ AOP 的区别
    • 三、AspectJ 定义的通知类型
    • 四、多个切面的执行顺序控制方法

一、概述

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
请添加图片描述

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:
请添加图片描述
当然你也可以使用 AspectJ !Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

AOP 切面编程设计到的一些专业术语:

术语含义
目标(Target)被通知的对象
代理(Proxy)向目标对象应用通知之后创建的代理对象
连接点(JoinPoint)目标对象的所属类中,定义的所有方法均为连接点
切入点(Pointcut)被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点)
通知(Advice)增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情
切面(Aspect)切入点(Pointcut)+通知(Advice)
Weaving(织入)将通知应用到目标对象,进而生成代理对象的过程动作

二、Spring AOP 和 AspectJ AOP 的区别

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。

Spring AOP(面向切面编程)和AspectJ AOP都是面向切面编程的框架,用于在应用程序中实现横切关注点的模块化。尽管它们的目标相似,但它们在实现方式、集成方式以及功能上有一些区别。

  • 实现方式:
    • Spring AOP:Spring AOP是Spring框架提供的一种轻量级AOP实现。它通过使用代理技术(基于JDK动态代理或CGLIB)来实现AOP。Spring AOP仅支持方法级别的连接点(切点),并且提供了前置通知、后置通知、环绕通知、异常通知和最终通知等通知类型。
    • AspectJ AOP:AspectJ AOP是一个独立于Spring的AOP框架,它提供了更强大和灵活的AOP功能。它可以通过编译时织入(AspectJ编译器)或运行时织入(使用字节码增强)来实现AOP。AspectJ支持更丰富的切点表达式和通知类型,包括引入(Introduction)和优化的连接点。
  • 切点表达式:
    • Spring AOP:Spring AOP的切点表达式相对简单,支持基于方法名、参数等的简单匹配。
    • AspectJ AOP:AspectJ提供了更强大的切点表达式,可以匹配更复杂的结构,如类的属性、构造函数等。
  • 集成方式:
    • Spring AOP:Spring AOP与Spring框架紧密集成,可以无缝地与Spring应用程序一起使用。Spring AOP更适合那些已经在使用Spring框架的项目。
    • AspectJ AOP:AspectJ是一个独立的框架,可以与任何Java应用程序一起使用。它可以在不使用Spring框架的情况下集成到应用程序中。
  • 功能性:
    • Spring AOP:适用于轻量级的AOP需求,可以实现一些常见的横切关注点,如日志记录、事务管理等。
    • AspectJ AOP:适用于更复杂的AOP需求,提供了更多的切点表达式和通知类型,可以实现更精细的切面功能。

三、AspectJ 定义的通知类型

  • Before(前置通知):目标对象的方法调用之前触发
  • After (后置通知):目标对象的方法调用之后触发
  • AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发
  • AfterThrowing(异常通知):目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
  • Around (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法

四、多个切面的执行顺序控制方法

  • 通常使用@Order 注解直接定义切面顺序
    // 值越小优先级越高
    @Order(3)
    @Component
    @Aspect
    public class LoggingAspect implements Ordered {
    
  • 实现Ordered 接口重写 getOrder 方法
    @Component
    @Aspect
    public class LoggingAspect implements Ordered {// ....@Overridepublic int getOrder() {// 返回值越小优先级越高return 1;}
    }
    

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

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

相关文章

cookie是什么?

cookie是什么? Cookie实际上是一小段的文本信息。 http协议本身是无状态的。无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response)&…

【单片机】DS2431英文手册,中文手册,翻译

DS2431是一款1024位的1-Wire EEPROM芯片,以每个256位的四个内存页面组织。数据被写入8字节的暂存区,经过验证,然后复制到EEPROM存储器中。作为一个特殊功能,四个内存页面可以单独地被写保护,或者被置于EPROM仿真模式&a…

腾讯云轻量应用服务器镜像应用模板清单大全

腾讯云轻量应用服务器支持多种应用模板镜像,Windows和Linux镜像模板都有,如:宝塔Linux面板腾讯云专享版、WordPress、WooCommerce、LAMP、Node.js、Docker CE、K3s、宝塔Windows面板和ASP.NET等应用模板镜像,腾讯云服务器网分享腾…

Cobbler自定义yum源

再次了解下Cobbler的目录结构: 在/var/www/cobbler/ks_mirror目录下存放的是所有的镜像。 存放的是仓库镜像: 在/var/lib/cobbler/kickstarts目录下是存放的所有的kickstarts文件。 再有就是/etc/cobbler这个目录: [rootvm1 loaders]# cd /…

操作系统—网络系统

什么是零拷贝 磁盘是计算机系统最慢的的硬件之一,所以有不少优化磁盘的方法,比如零拷贝、直接IO、异步IO等等,这些优化的目的是为了提高系统的吞吐量,另外操作系统内核中的磁盘高度缓存区,可以有效的减少磁盘的访问次…

系统学习Linux-Redis基础

一、redis概述 NoSQL(非关系型数据库、内存存储) 类型 文档型数据库(Document-oriented database)如MongoDB; 列族数据库(Column-family database)如HBase、Cassandra等; 图形数…

Databend 开源周报第 105 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Databend 轻量级…

【Linux】TCP协议简介

TCP协议简介 TCP协议格式面向连接1.连接管理机制2.包序管理 可靠传输1.保证数据可靠到达对端2.保证数据的传输效率 面向字节流TCP粘包问题 TCP协议格式 16位源端口号和16位目的端口号:标识数据从哪个进程来,到哪个进程…

RocketMQ Learning(二)

目录 一、RocketMQ 1、顺序消息 2、延时消息 3、批量消息 批量切分发送 4、消息的过滤 Tag过滤 Sql过滤 5、分布式事务消息 6、Request-Reply消息 7、死信队列 一、RocketMQ 1、顺序消息 消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证…

STM32F429IGT6使用CubeMX配置外部中断按键

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…

阿里云服务器部署Drupal网站教程基于CentOS系统

阿里云百科分享如何在CentOS 7操作系统的ECS实例上搭建Drupal电子商务网站。Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。它用于…

如何实现Excel中多级数据联动

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在类Excel表格应用中,常用的需求场景是根据单元格之间的数据联动&…

C++ STL list

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C之 STL list介绍和模拟实现 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;上次我们详细的介绍了vector&#xff0c;今天我们继续来介绍…

VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR

文章目录 VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIORABSTRACT1 INTRODUCTION2 COMPRESSION WITH VARIATIONAL MODELS3 INTRODUCTION OF A SCALE HYPERPRIOR 个人总结动机流程思路 VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR ABSTRACT We describe …

【BASH】回顾与知识点梳理(十七)

【BASH】回顾与知识点梳理 十七 十七. 什么是 Shell scripts17.1 干嘛学习 shell scripts自动化管理的重要依据追踪与管理系统的重要工作简单入侵检测功能连续指令单一化简易的数据处理跨平台支持与学习历程较短 17.2 第一支 script 的撰写与执行撰写第一支 script 17.3 撰写 s…

css flex 上下结构布局

display: flex; flex-flow: column; justify-content: space-between;

腾讯云服务器远程连接的方法大全

腾讯云服务器怎么连接登录&#xff1f;腾讯云服务器支持多种远程连接方法&#xff0c;可以使用腾讯云管理控制台自带的远程连接工具&#xff0c;也可以使用第三方远程连接工具&#xff0c;如如PuTTY、Xshell等&#xff0c;Linux操作系统可以SSH登录&#xff0c;Windows可以使用…

swagger 3.0 学习笔记

引入pom <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency>配置 import io.swagger.models.auth.In; import io.swagger.v3.oas.annotati…

Linux计算机名自动变为bogon,修改计算机名

Linux计算机名自动变为bogon&#xff0c;修改计算机名 问题&#xff1a;这次机房停电&#xff0c;部分VM计算机名自动变为bogon&#xff0c;判断故障&#xff1a;因开启VM的时候&#xff0c;网卡需要获取DNS&#xff0c;但是DNS服务器还没有起来&#xff0c;故自动在resolv.con…

innodb buffer pool

buffer pool是主存中的一个区域&#xff0c;InnoDB 在访问时缓存表和索引数据。缓冲池允许直接从内存访问频繁使用的数据&#xff0c;这加快了处理速度。在专用服务器上&#xff0c;高达80% 的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率&#xff0c;将缓冲池划分…