Spring AOP核心概念与操作示例

news2024/11/17 22:32:33

AOP 核心概念

还记得我们Spring有两个核心的概念嘛?一个是IOC/DI,另一个是AOP咯。

先来认识两个概念:

  • AOP(Aspect Oriented Programming)面向切面编程;作用:在不惊动原始设计的基础上为其进行功能增强,类似代理模式。
  • OOP(Object Oriented Programming)面向对象编程

在这里插入图片描述

  • 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等 ,在SpringAOP中,理解为方法的执行
  • 切入点(Pointcut):匹配连接点的式子,在SpringAOP中,一个切入点可以描述一个具体方法,也可也匹配多个方法
    • 一个具体的方法:如com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
    • 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
    • 连接点范围要比切入点范围大,是切入点的方法也一定是连接点,但是是连接点的方法就不一定要被增强,所以可能不是切入点。
  • 通知(Advice):在切入点处执行的操作,也就是共性功能,在SpringAOP中,功能最终以方法的形式呈现
  • 通知类:定义通知的类
  • 切面(Aspect):描述通知与切入点的对应关系。
  • 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
  • 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
  • 切点(PointCut): 可以插入增强处理的连接点。
  • 切面(Aspect): 切面是通知和切点的结合。

知识点1:@EnableAspectJAutoProxy

名称@EnableAspectJAutoProxy
类型配置类注解
位置配置类定义上方
作用开启注解格式AOP功能

知识点2:@Aspect

名称@Aspect
类型类注解
位置切面类定义上方
作用设置当前类为AOP切面类

知识点3:@Pointcut

名称@Pointcut
类型方法注解
位置切入点方法定义上方
作用设置切入点方法
属性value(默认):切入点表达式

知识点4:@Before

名称@Before
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行

AOP示例

项目准备

创建一个Maven项目

  • pom.xml添加Spring依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
    </dependencies>
    
  • 添加BookDao和BookDaoImpl类

    public interface BookDao {
        public void save();
        public void update();
    }
    
    @Repository
    public class BookDaoImpl implements BookDao {
    
        public void save() {
            System.out.println(System.currentTimeMillis());
            System.out.println("book dao save ...");
        }
    
        public void update(){
            System.out.println("book dao update ...");
        }
    }
    
  • 创建Spring的配置类

    @Configuration
    @ComponentScan("com.taro")
    public class SpringConfig {
    }
    
  • 编写App运行类

    public class App {
        public static void main(String[] args) {
            ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
            BookDao bookDao = ctx.getBean(BookDao.class);
            bookDao.save();
        }
    }
    

实现功能说明:

  • 目前打印save方法的时候,因为方法中有打印系统时间,所以运行的时候是可以看到系统时间
  • 对于update方法来说,就没有该功能
  • 我们要使用SpringAOP的方式在不改变update方法的前提下让其具有打印系统时间的功能。

具体AOP操作步骤

步骤1:添加依赖

pom.xml

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
</dependency>
  • 因为spring-context中已经导入了spring-aop,所以不需要再单独导入spring-aop
  • 导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。

步骤2:定义接口与实现类

环境准备的时候,BookDaoImpl已经准备好,不需要做任何修改

步骤3:定义通知类和通知

通知就是将共性功能抽取出来后形成的方法,共性功能指的就是当前系统时间的打印。

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

类名和方法名没有要求,可以任意。

步骤4:定义切入点

BookDaoImpl中有两个方法,分别是save和update,我们要增强的是update方法,该如何定义呢?

public class MyAdvice {
    @Pointcut("execution(void com.taro.dao.BookDao.update())")
    private void pt(){}
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

说明:

  • 切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。

步骤5:制作切面

切面是用来描述通知和切入点之间的关系,如何进行关系的绑定?

public class MyAdvice {
    @Pointcut("execution(void com.taro.dao.BookDao.update())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置

在这里插入图片描述

说明:@Before翻译过来是之前,也就是说通知会在切入点方法执行之前执行,除此之前还有其他四种类型。我们后面慢慢道来。

步骤6:将通知类配给容器并标识其为切面类

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.taro.dao.BookDao.update())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

步骤7:开启注解格式AOP功能

@Configuration
@ComponentScan("com.taro")
@EnableAspectJAutoProxy
public class SpringConfig {
}

步骤8:运行类编写

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.update();
    }
}

然后就会发现嗯。。。update也可以打印系统时间咯,这不是重点,AOP是怎么定义操作的才是我们值得学习的。

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

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

相关文章

Linux命令行操作/选项介绍,文件分类/内容与属性/绝对相对路径,隐藏文件与整个目录结构

Linux的命令行操作介绍 Linux操作的特点&#xff1a;纯命令行&#xff0c;当然Linux它也有图形化界面或桌面版。Windows也有命令行&#xff0c;也有图形化界面。不过它是面向普通客户的操作系统&#xff0c;所以必须得是好用好玩的&#xff0c;所以图形化界面那是必然。无论是…

PCL点云库(2) - IO模块

目录 2.1 IO模块接口 2.2 PCD数据读写 &#xff08;1&#xff09; PCD数据解析 &#xff08;2&#xff09;PCD文件读写示例 2.3 PLY数据读写 &#xff08;1&#xff09;PLY数据解析 &#xff08;2&#xff09;PLY文件读写示例 2.4 OBJ数据读写 &#xff08;1&#xff…

网易云信 RTC 音频 QoS 综述

RTC、QoS、WebRTC 的定义 RTC 实时通信&#xff0c;泛指各种数据的实时传输技术&#xff0c;包括音频&#xff0c;视频&#xff0c;文本&#xff0c;图片等媒体和非媒体数据的实时传输。 QoS 服务质量&#xff0c;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信…

狂买GPU、四处挖人,马斯克:我要做理解宇宙的TruthGPT

来源: 爱范儿 微信号&#xff1a;ifanr 整理 | 凌敏、核子可乐 上个月&#xff0c;马斯克还积极呼吁叫停超强 AI 研发 6 个月&#xff0c;现在就坐不住了&#xff1f; 马斯克声称正在研究 TruthGPT 近日&#xff0c;马斯克在接受福克斯新闻频道的塔克卡尔森采访时宣布&#…

小红书投放预算如何制定,品牌规划

进行产品与品牌推广是一件相对复杂而全面的事。以小红书为例&#xff0c;当我们在制定产品投放传播方案时&#xff0c;确定平台投放预算是首要的。今天将为大家分享&#xff0c;如何制定小红书投放预算最为合理高效。 一、目的决定预算 在说明具体的预算计算方法之前&#xff0…

[数据库]MySQL窗口函数

1.窗口函数是什么 玛雅人造不出轮子,也不需要轮子. 在学完基础以后,通过子查询和聚合函数,理论上可以解决任何复杂的sql查询问题,但是人类发明出来轮子绝对不是用来看着它转圈的. 窗口函数和聚合函数非常相似,区别在于聚合函数是将多个行结合成一个结果,而窗口函数是以某个区…

webrtc janus服务器部署在公网,coturn转发媒体流

janus本身部署在公网时&#xff0c;其内部使用的libnice库已经实现了stun的功能&#xff0c;在配置文件janus.jcfg里面&#xff0c;nat_1_1_mapping配置成公网地址&#xff0c;其位于NAT后面的局域网客户端之间可以实现媒体流之间的分享&#xff0c;发布者将媒体流推到公网&…

【网络】-- https协议

目录 http协议 https协议 安全 概念 什么是"加密"&#xff1f; 为什么要加密&#xff1f; 常见的加密方式 对称加密 非对称加密 数据摘要 && 数据指纹 数字签名 HTTPS 的工作过程探究 方案一&#xff1a;只使用对称加密 方案二&#xff1a;只使…

深眸科技|制造行业升级速度加快,2D视觉与3D视觉该如何选择?

随着人工智能的不断发展&#xff0c;机器视觉已经成为当下最炙手可热的技术之一。在制造业转型升级并且迅猛发展的过程中&#xff0c;对于产品的高精度、零缺陷的需求也在不断提升&#xff0c;而机器视觉的出现为制造业产业升级提供了强有力的驱动力。 随着5G、AI等技术的不断…

174_技巧_Power BI 动态格式(万|亿)

174_技巧_Power BI 动态格式(万|亿) 一、背景 Power BI 2023年4月份更新&#xff0c;新增加了一个预览功能&#xff1a;动态格式(Dynamic format strings for measures)&#xff0c;度量值的结果可以动态的显示为不同的格式。 今天我们主要来看一个技巧&#xff0c;如何在 P…

[架构之路-171]-《软考-系统分析师》-5-数据库系统-1- 数 据 库 的 控 制 功 能(并发控制、性能优化)

目录 5 . 4 数 据 库 的 控 制 功 能 5.4.1 并发控制 1 . 事务的基本概念 2 . 数据不一致问题 3 . 封锁协议 4 . 死锁问题 5.4.2 数据库性能优化 1 . 硬件升级 2 . 数据库设计 5.4.3 数据库的完整性 1 . 完整性约束条件 2 . 实体完整性 3 . 参照完整性 4 . 用户定…

华为云-使用脚本初始化Linux数据盘

操作场景 本文以云服务器的操作系统为“CentOS 7.4 64位”为例&#xff0c;采用初始化数据盘脚本的方式为数据盘设置分区。 不同云服务器的操作系统的格式化操作可能不同&#xff0c;本文仅供参考。 须知&#xff1a; 首次使用磁盘时&#xff0c;如果您未参考本章节对磁盘执…

json for modern c++

目录 json for modern c概述编译问题问题描述问题解决 读取JSON文件demo json for modern c GitHub - nlohmann/json: JSON for Modern C 概述 json for modern c是一个德国大牛nlohmann写的&#xff0c;该版本的json有以下特点&#xff1a; 1.直观的语法。 2.整个代码由一个…

QT 创建插件 CTK开发(三)

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而不会增加现有任务的负担;整合并适应成功的解决方案。 本专栏文章较为全面…

DP4056国产兼容替代LTC40561A锂离子电池充电芯片

目录 锂电池 VS 锂离子电池DP4056简介DP4056芯片特性 锂电池 VS 锂离子电池 锂电池是以锂金属或锂合金为正极材料&#xff0c;使用非水电解质溶液的电池。锂电池与锂离子电池不一样的是&#xff0c;前者是一次电池&#xff0c;后者是充电电池。锂离子电池工作原理就是依靠锂离…

(大数据开发随笔6)Hadoop 3.3.x分布式环境部署——本地模式

本地模式 材料准备 Linux虚拟机-CentOS7hadoop-3.3.1.tar.gz Index of /hadoop/common (apache.org)jdk-8u321-linux-x64.tar.gz Java Archive | Oracle Centos7虚拟机部署 准备材料&#xff1a; VMware17CentOS-7-x86_64-Minimal-2009.iso centos-7-isos-x86_64安装包下载…

2022国赛34:路由器之间ISIS协议配置

大赛试题内容: 5.RT1以太链路、RT2以太链路之间运行ISIS协议,进程10,分别实现loopback3 之间ipv4互通和ipv6互通。RT1、RT2的NET分别为10.0000.0000.0001.00、10.0000.0000.0002.00,路由器类型是Level-2,接口网络类型为点到点。配置域md5认证和接口md5认证,密码均为Key…

企业如何从0到1落地BI项目

企业需要数据整合、分析展现及应用的完整数据平台方案。为了满足集团化BI建设需求&#xff0c;企业决策层需要基于全局数据进行分析&#xff0c;需要提供数据整合、存储、计算到数据应用的端到端数据平台。 商业智能BI - 派可数据BI可视化分析平台 BI的实践落地需要全生命周期…

[Python基础] 序列(列表/元组)和字典的操作详解

文章目录 序列概念序列列表列表的创建和下标访问创建下标 列表的切片操作列表的遍历列表的插入操作列表的查找和删除列表的拼接 元组元组的相关操作 字典概念字典的创建查找字典中的key&#xff0c;value字典的增删改字典的遍历 序列概念 包含若干个元素, 元素有序排列, 可以通…

APIs -- DOM节点操作

1. 日期对象 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 1.1 实例化 在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间&#xff1a;const date new Date(); // 实例化 new// 1.得到当前时…