面向切面编程AOP

学Java比搞科研快乐多了

AOP(Aspect rient Programming),面向切面编程,AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,实现开闭原则。

主要术语:

  • 连接点(JoinPoint):类里面可以被增强的方法

  • 切入点(Pointcut) :实际被增强的方法,假如⼀个类中有四个方法,但是只增强两个,那么这两个就是切入点。

  • 通知(Advice):实际增强的逻辑部分,也就是若干个方法的共性功能,在切入点处执行,最终体现为一个方法。有如下五种类型:

    @Before:前置通知,在方法执行之前执行
    @Aroud:环绕通知,围绕着方法执行 (重点)
    @After:后置通知,在方法执行之后执行
    @AfterReturning:返回通知,在方法返回结果之后执行
    @AfterThrowing:异常通知,在方法抛出异常之后

  • 切面(Aspect):描述通知与切入点的对应关系,也就是哪些通知方法对应哪些切入点方法。

1 AOP入门案例思路分析

案例设定:测定接口执行效率
简化设定:在接口执行前输出当前系统时间
开发模式:注解
思路分析:
a. 导入坐标(pom.xml)
b. 制作连接点方法(原始操作的dao接口与实现类)
c. 定义通知类与通知方法 //通知类必须用@Component配置成Spring管理的bean
d. 配置切面类@Aspect: 定义切入点表达式@PointCut中表示需要加通知的方法;@Around(绑定切入点与通知关系)
e. 在配置类中进行Spring注解包扫描和开启AOP功能

2.2 AOP入门案例实现

【第一步】导入aop相关坐标

<dependencies><!--spring核心依赖,会将spring-aop传递进来--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><!--切入点表达式依赖,目的是找到切入点方法,也就是找到要增强的方法--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>
</dependencies>

【第二步】定义dao接口与实现类

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 ...");}
}

【第三步】定义通知类,制作通知方法

@Component //通知类必须配置成Spring管理的bean
public class MyAdvice {public void method(){System.out.println(System.currentTimeMillis());}
}

【第四步】(重点) 配置切面类@Aspect (需要定义切入点表达式@PointCut中表示需要加通知的方法,通知@Around(绑定切入点与通知关系))

@Component //通知类必须配置成Spring管理的bean
@Aspect //设置当前类为切面类,告诉spring,这个类中有切点和通知
public class MyAdvice {//设置切入点,@Pointcut匹配需要应用通知的方法。@Pointcut("execution(void com.itheima.dao.BookDao.update())")//表示匹配 com.itheima.dao.BookDao 类中的 update 方法,该方法的返回类型是 void。private void pt(){} //占位符,这里的pt()和下面的pt()对应//设置在切入点pt()的前面运行当前操作(前置通知)@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}@Around("pt()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around before advice ...");Object ret = pjp.proceed();//对原始对象方法进行调用,返回值为原始对象方法的返回值。System.out.println("around after advice ...");return ret;}
}

这段代码的整体功能是在 com.itheima.dao.BookDao 类的 update 方法执行前,先输出当前系统时间。
【第五步】在配置类中进行Spring注解包扫描和开启AOP功能

@Configuration
@ComponentScan("com.itheima")
//开启注解开发AOP功能
@EnableAspectJAutoProxy//开了这个之后,spring寻找@Aspect,然后进行切面
public class SpringConfig {
}

3 AOP工作流程【理解】

问题导入
什么是目标对象?什么是代理对象?

3.1 AOP工作流程

  1. Spring容器启动

  2. 读取所有切面配置中的切入点

  3. 初始化bean,判定bean对应的类中的方法是否匹配到任意切入点
    ○ 匹配失败,创建原始对象
    ○ 匹配成功,创建原始对象(目标对象)的代理对象

  4. 获取bean执行方法
    ○ 获取的bean是原始对象时,调用方法并执行,完成操作
    ○ 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

3.2 AOP核心概念

目标对象(Target):被代理的对象,也叫原始对象,该对象中的方法没有任何功能增强。
代理对象(Proxy):代理后生成的对象,由Spring帮我们创建代理对象。

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

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

相关文章

.NET周刊【5月第4期 2024-05-26】

国内文章 开源低代码框架 ReZero API 正式版本发布 &#xff0c;界面操作直接生成API https://www.cnblogs.com/sunkaixuan/p/18201175 ReZero是一款.NET6的中间件&#xff0c;采用MIT许可证开源&#xff0c;目的是降低.NET Core开发的门槛。它提供界面操作生成API的功能&am…

【杂记-OSPF协议中浅析不同类型报文】

1、发送报文的频率&#xff1a;运行OSPF的路由器在低速网络中每40秒发送一次Hello报文&#xff0c;高速网络中每10秒发送一次Hello报文&#xff0c;由于现在的网络几乎都是以太网&#xff0c;所以每10秒发送一次。 2、部分报文的作用&#xff1a;发现并建立邻居关系、选举DR/BD…

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…

大规模语言模型的书籍分享

在当今人工智能领域&#xff0c;大规模语言模型成为了研究和应用的热点之一。它们以其大规模的参数和强大的性能表现&#xff0c;推动着机器学习和深度学习技术的发展。对于GPT 系列大规模语言模型的发展历程&#xff0c;有两点令人印象深刻。 第一点是可拓展的训练架构与学习范…

《TCP/IP网络编程》(第十二章)I/O复用(1)

本章将讨论实现并发服务器的第二种办法&#xff0c;基于I/O复用的服务器端构建。 I/O复用它允许单个进程或线程同时处理多个输入/输出&#xff08;I/O&#xff09;操作&#xff0c;而无需为每个I/O操作创建一个独立的线程或进程。这种技术可以显著提高应用程序的效率和性能&…

吊顶的做法防踩坑,吊顶怎么省钱还好看

怎么做个好看的吊顶?你天天抬头看不? 现在楼房到手本身层高两米75左右,等铺完地暖和瓷砖还得增加几公分 如果再整个吊顶,就属于花钱买压抑了,吊顶就是遮丑, 某些比较显层高还亮堂,今天把做法分享出来 开发商给的毛坯两米8 做完地暖铺完瓷砖,层高是两米七八, 让木工在走廊两边…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX&#x1f349;JSX简介与使用&#x1f349;JSX语法规则 1.4模块与组件&#x1f349;模块&#x1f349;组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件&#x1f349;函数式组件&#x1f349…

Elasticsearch 认证模拟题 - 1

1、题目 定义一个数据流&#xff0c;满足 data-stream_*_*&#xff0c;数据首先分布在 data_hot&#xff0c;5分钟后移动到 data_warm&#xff0c;3分钟后到 data_cold&#xff0c;再过 8 分钟删除。 1.1 考点 生命周期索引模板数据流 1.2 答案 # 修改生命周期策略修改时间…

【算法】位运算算法——只出现一次的数字Ⅱ

题解&#xff1a;只出现一次的数字Ⅱ(位运算算法) 目录 1.题目2.题解&#xff1a;3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 要求&#xff1a;时间复杂度&#xff1a;O(N)&#xff0c;空间复杂度&#xff1a;O(1) 2.题解&#xff1a; 3.代码示例 class Solution {…

Java设计模式 _行为型模式_中介者模式

一、中介者模式 1、中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型模式。主要通过一个中介类&#xff0c;该类通常处理不同类之间的通信&#xff0c;并支持松耦合&#xff0c;使代码易于维护。 2、实现思路 &#xff08;1&#xff09;、定义实体…

U-Net结构的特点

U-Net是一种用于图像分割的卷积神经网络架构&#xff0c;最初由Olaf Ronneberger等人提出&#xff0c;专门用于生物医学图像的分割任务。其设计特点和结构使其在各种图像分割任务中表现出色。以下是U-Net结构的主要特点和关键组件&#xff1a; 1. U形结构 U-Net的整体结构呈现…

使用arco design实现动态列信息的表格

目录 1.说明 2.普通表格的实现 3.动态表格的实现 1.说明 在前端画面中&#xff0c;表格一般用来展示列表数据&#xff0c;并且可以实现分页&#xff0c;应用很广泛&#xff0c;关于表格的列信息&#xff0c;一般是固定的&#xff0c;也可以是变化的&#xff0c;根据后端传递…

一文读懂 javascript 函数返回值

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 这篇文章…

怎么提取pdf格式中的英语单词

思路&#xff1a; 第一步&#xff1a;适用python把需要导出的pdf文件单词导出到txt 第二步&#xff1a;把导出的txt导入到软件单词库&#xff0c;例如&#xff0c;金山词霸等软件内 第三步&#xff1a;熟练掌握以及删除单词库部分单词&#xff0c;达到对英文标准的单词记忆&…

0528-算法岗面试题

多模态 CLIP原理 描述对比学习函数 BLIP BLIP2架构和区别 LLaVa和BLIP2区别 LLaVa两阶段的训练过程和数据集的构建 LLaVa1.5 1.6的改进 cross-attention和self-attention区别 cross-attention在图文匹配中q和kv分别指什么&#xff0c;在机器翻译中分别指什么 one shot&#xf…

okcc呼叫中心如何创建语音群呼(通知)功能?

要在OKCC呼叫中心系统中创建语音群呼&#xff08;通知&#xff09;功能&#xff0c;您可以按照以下步骤进行&#xff1a; 准备语音通知内容&#xff1a; 确定您想要发送的语音通知内容&#xff0c;包括文字内容和语音录音。 配置群呼功能&#xff1a; 在OKCC呼叫中心系统的管理…

【Linux】-Kafka集群安装部署[18]

简介 Apache Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的…

Oracle数据库之事务(十四)

在Oracle数据库中&#xff0c;事务是工作的逻辑单元&#xff0c;用于确保数据的一致性和完整性。以下是对Oracle事务的详细解释&#xff1a; 1. 定义 事务&#xff1a;在数据库中&#xff0c;事务是由一个或多个SQL语句组成的逻辑单元&#xff0c;这些语句共同完成一组相关的…

K210 数字识别 笔记

一、烧写固件 连接k210开发板&#xff0c;点开烧录固件工具&#xff0c;选中固件&#xff0c;并下载 二、模型训练 网站&#xff1a;MaixHub 1、上传文件 2、开始标记数据 添加9个标签&#xff0c;命名为1~9&#xff0c;按键盘w开始标记&#xff0c;键盘D可以下一张图片&…

解密Prompt系列15. LLM Agent之数据库应用设计:DIN C3 SQL-Palm BIRD

上一章我们主要讲搜索引擎和LLM的应用设计&#xff0c;这一章我们来唠唠大模型和DB数据库之间的交互方案。有很多数据平台已经接入&#xff0c;可以先去玩玩再来看下面的实现方案&#xff0c;推荐 [sql translate]&#xff1a;简单&#xff0c;文本到SQL&#xff0c;SQL到文本…