-aop-

news2024/10/5 16:24:39

文章目录

  • 一.动态代理实现invocationHandler
  • 二.AOP概述
    • 环绕通知
    • Pointcut定义切入点

一.动态代理实现invocationHandler

动态代理:可以在程序的执行过程中,创建代理对象。
通过代理对象执行方法,给目标类的方法增加额外的功能(功能增强)

jdk动态代理实现步骤:
1.创建目标类
2.创建InvocationHandler接口的实现类,在这个类实现给目标方法增加功能
3.创建jdk中,类proxy,创建代理对象。实现创建对象的能力。


二.AOP概述

AOP:面向切面编程。面向切面编程是从动态角度考虑程序运行过程。
APO底层,就是采用动态代理模式实现的 。可以使用jdk,cglib两种代理方式。

AOP就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方式,使用动态代理。

实现方式:
①jdk的动态代理,使用jdk中的proxy,method,invovaitonHanderl创建代理对象。jdk动态代理要求目标类必须实现接口
②cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。子类就是代理对象。要求目标类不能是final的,方法也不能是final的。

动态代理的作用:
①在目标类源代码不改变的情况下,增加功能
②减少代码的重复
③专注业务逻辑代码
④解耦合,让业务功能和日志,事务非事务功能分离。

AOP(Aspect Orient Programming)面向切面编程
Aspect:切面,给你的目标类增加的功能,就是切面。像上面用的日志,事务都是切面
切面的特点:一般都是非业务方法,独立使用
Orient:面向,对着
Programming:编程

术语:
(1)Aspect:切面,表示增强的功能,就是一堆代码,完成某个一个功能。非业务功能,常见的切面功能有日志,事务,统计信息,参数检查,权限验证。
(2)JoinPoint:连接点,连接业务方法和切面的位置。就是某类中的业务方法。
(3)pointcut:切入点,指多个连接点方法的集合。多个方法
(4)目标对象:给哪个类的方法增加功能,这个类就是目标对象。
(5)Advice:通知,通知表示切面功能执行的时间。

aop的实现:
aop是一个规范,是动态的一个规范化,一个标准
aop的技术实现框架:
1.spring :spring在内部实现了aop规范,能做aop的工作。
spring主要在事务处理时使用aop。
2.aspectJ:一个开源的专门做aop的框架。spring框架中集成了aspectj框架,通过spring就能使用aspectj的功能。

实现aop有两种方式:
1.使用xml的配置文件:配置全局事务
2.使用注解,我们在项目中要做aop功能,一般都使用注解,aspectj有五个注解。

(1)切面的执行时间,这个执行时间在规范中叫做Advice(通知,增强)
在aspectj框架中使用注解表示的:
①@Before
②@AfterReturning
③@Around
④@AfterThrowing
⑤@After
也可以使用xml配置文件中的标签

(2)表示切面执行的位置,使用的是切入点表达式
在这里插入图片描述
在这里插入图片描述

execution(访问权限 方法返回值 方法声明(参数) 异常类型)

在这里插入图片描述


使用aspectj实现aop的基本步骤
1.新建maven项目

2.加入依赖
①spring依赖

<!--spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

②aspectj依赖

<!--aspectj依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

③junit单元测试

3.创建目标类:接口和他的实现类
要做的是给类中的方法增加功能

4.创建切面类:普通类
①在类的上面加入@Aspect
②在类中定义方法,方法就是切面要执行的功能代码
在方法的上面要加入aspectj中的通知注解,例如@Before
有需要指定切入点表达式execution()

5.创建spring的配置文件:声明对象,把对象交给容器统一管理
声明对象可以使用注解,或者XML配置文件bean
①声明目标对象
②声明切面类对象
③声明aspectj框架中的自动代理生成器标签
自动代理生成器:用来完成代理对象的自动创建功能的

6.创建测试类,从spring容器中获取目标对象(实际就是代理对象)。
通过代理执行方法,实现aop的功能增强。

环绕通知

定义格式:
①public
②必须有一个返回值,推荐使用object
③方法名称自定义
④方法有参数,固定的参数proceedingJoinPoint

注解:@Around:环绕通知
属性:value 切入点表达式
位置:在方法的定义什么

特点:
①它是功能最强的通知
②在目标方法的前和后都能增强功能
③控制目标方法是否被调用执行
④修改原来的目标方法的执行结果。影响最后的调用结果

环绕通知,等同于jdk动态代理,InvocationHandler接口

参数:ProceedingJoinPoint就等同于Method
作用:执行目标方法的
返回值:就是目标方法的执行结果,可以被修改。

环绕通知:经常做事务,在目标方法之前开启事务,执行目标方法,在目标方法之后提交事务


Pointcut定义切入点

@Pointcut:定义和管理切入点,如果你的项目中有多个切入点表达式是重复的,可以复用的。可以使用@Pointcut
属性:value 切入点表达式
位置:在自定义的方法的上面
特点:
当使用@Pointcut定义在一个方法的上面,此时这个方法的名称就是切入点式的别名。
其它的通知中,value属性就可以使用这个方法名称,代替切入点表达式
在这里插入图片描述

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

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

相关文章

Filebeat采集数据到ES保证数据不重复

一.背景 业务需求使然&#xff0c;API接口负责收集用户传递上来的json数据&#xff0c;为了保证接口性能和数据的可靠性。我们没有直接拿到数据&#xff0c;然后存储到mysql或者kafka&#xff0c;而是直接使用最稳妥的方式&#xff0c;写文件。之后采用filebeat对数据文件进行采…

8_1、Java基本语法之多线程基本概念

一、涉及到多线程的基本概念 1、程序(programm) 概念&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码&#xff0c;静态对象。 2、进程(process) 概念&#xff1a;是程序的一次执行过程&#xff0c;或是正在运行的一个程…

Cy7 Tyramide, Tyramide-Cy7,花青素Cy7 酪酰胺化学试剂供应

一&#xff1a;产品描述 1、名称 英文&#xff1a;Cyanine7 Tyramide&#xff0c;Cy7 Tyramide&#xff0c;Tyramide-Cy7 中文&#xff1a;花青素Cy7 酪酰胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Cyanine 4、分子量&#xff1a;802.01 5、分子式&#xff…

Docker学习6-Docker镜像commit操作案例

在上一篇中&#xff0c;我们知道了docker是基于联合文件系统的分层镜像。而且也知道了镜像是只读的&#xff0c;容器才是可以写的。那么&#xff0c;如果我们要修改镜像&#xff0c;修改之后&#xff0c;怎么提交呢&#xff1f;本文&#xff0c;凯哥将介绍&#xff0c;docker的…

svd分解

sklearn中svd分解 class sklearn.decomposition.TruncatedSVD(n_components2, *, algorithmrandomized, n_iter5, random_stateNone, tol0.0) 参数&#xff1a; n_components&#xff1a;整数&#xff0c;默认2 输出数据的所需维度。必须严格小于特征数。默认值对可视化很有用…

Git 操作 Gitea 出现 kex_exchange_identification: Connection closed by remote host

1. 问题背景 我的部分代码储存在使用 Gitea 搭建的服务上: DevWiki - 首页 - DevWiki Gitea 之前都是使用网页在网站上进行 仓库管理, 今天在clone代码的时候出现异常: kex_exchange_identification: Connection closed by remote host, 具体以下提示: $ git clone gitgit.d…

【案例分享】跨机房ES同步实战

背景 众所周知单个机房在出现不可抗拒的问题&#xff08;如断电、断网等因素&#xff09;时&#xff0c;会导致无法正常提供服务&#xff0c;会对业务造成潜在的损失。所以在协同办公领域&#xff0c;一种可以基于同城或异地多活机制的高可用设计&#xff0c;在保障数据一致性…

微软CTO谈AI:逃不掉马拉松就准备好跑鞋!30秒自动化妆机;ChatGPT刷爆票圈;剪纸风格的AI绘画 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 对话微软 CTO 凯文斯科特 (Kevin Scott)&#xff1a;人工智能将去向何方&#xff1f; https://blogs.microsoft.com/ai/a-conversation-with-kevi…

【卡塔尔世界杯】空调制冷,全是科技与狠活

半自动化越位技术比赛用球AI Rihla球场智能空调Feelix Palm辅助技术可持续利用的体育场便利的数字设施和App 西班牙队和英格兰队穿外套出场&#xff0c;卡塔尔的空调功率到底有多大&#xff1f; 还是很大的&#xff0c;不管是室外还是室内&#xff0c;到处都安装了空调&#…

Verilog系统函数

Verilog系统函数前言一、$width&#xff08;一&#xff09;简介&#xff08;二&#xff09;$width 参数&#xff08;三&#xff09;例子二、Specify参数三、$display&#xff08;一&#xff09;简介&#xff08;二&#xff09;格式说明&#xff08;三&#xff09;例子1.例12.例…

Bert论文解读及相关代码实践

Bert&#xff1a;Bidirectional Encoder Representations from Transformers Transformer中双向Encoder表达学习。BERT被设计为通过在所有层中对左右上下文进行联合调节&#xff0c;从未标记文本中预训练深度双向表示。预训练的BERT模型可以通过仅一个额外的输出层进行微调&am…

AVS-试听分割-论文阅读

题目: Audio-Visual Segmentation 论文地址:https://arxiv.org/abs/2207.05042 GitHub地址:https://github.com/OpenNLPLab/AVSBench 项目主页:https://opennlplab.github.io/AVSBench/ 相关博客https://arxiv.org/abs/2203.03821 摘要 We propose to explore a new pro…

(附源码)ssm汽车租赁 毕业设计 271621

基于ssm的汽车租赁平台的设计与实现 摘 要 随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了汽车租赁平台.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬…

微电网和直流电网中最优潮流(OPF)的凸优化(Matlab代码实现)

&#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;⛳️⛳️⛳️ 目录 1 概述 2 最优潮流 3 电力系统强大的CVX 4 直流电网中最优潮流&#xff08;OPF&#xff09;的凸优化 4.1 Matlab代码 4.2 运行结果 5 微电网中最优潮流&#xff08;OPF&#xff09;的凸优…

go gin web综合教程,包括 mysql redis log 路由

前言 在学习go许久&#xff0c;没看到网上有比较综合的gin web教程&#xff0c;很多都是最基础的教程&#xff0c;完全就是启动个服务返回参数&#xff0c;没有过多的结合实际开发。下面我结合一下我的经验&#xff0c;来写一篇深入的综合教程&#xff0c;包括数据库Mysql、re…

JMeter启动时常见的错误

很多小伙伴在学工具这一块时&#xff0c;安装也是很吃力的一个问题&#xff0c;之前记得有说过怎么安装jmeter这个工具。那么你要启动jmeter的时候&#xff0c;一些粉丝就会碰到如下几个问题。 1.解压下载好的jmeter安装&#xff0c;Windows 平台&#xff0c;双击 jmeter/bin …

基于python实现的SGM半全局立体匹配算法

文章目录前言一、SGM是什么&#xff1f;1.代价计算2.代价聚合3.视察计算4.视察优化二、基于python实现SGM算法&#xff1f;总结前言 开始正是入门立体匹配算法啦&#xff0c;会不断更新立体匹配的算法和代码。   水平有限&#xff0c;旨在先了解和读懂别人的代码的实现方式&a…

3D立体匹配入门 - 视差计算

经典假设 1、左右视图成功匹配的窗口&#xff0c;具有相同的像素 这个是最经典的假设&#xff0c;几乎所有视差图计算都用上了他&#xff0c;通过匹配左右窗口像素&#xff0c;得到最佳匹配对应的x轴坐标差&#xff0c;就是视差 2、像素P的视差只与其领域有关 这个是基于马尔…

外汇天眼:即使与世界第一的差价合约提供商交易也会被骗!

你能想象&#xff0c;当你与世界第一的差价合约提供商进行交易时&#xff0c;也可能会被骗吗&#xff1f; 在投资理财多元化的今天&#xff0c;外汇投资理财也备受大家的关注&#xff0c;而与此同时&#xff0c;骗子的诈骗渠道也与时俱进&#xff0c;各类外汇投资骗局也层出不穷…

VMware Workstation 17.0 Pro SLIC Unlocker for Linux

VMware_Dell_2.6_BIOS-EFI64_Mod&#xff1b;macOS Unlocker&#xff0c;支持 macOS Ventura 请访问原文链接&#xff1a;VMware Workstation 17.0 Pro SLIC & Unlocker for Windows & Linux&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&a…