当前位置: 首页 > news >正文

JavaWeb后端开发总结(3)

AOP基础

AOP概述

首先我们要知道AOP是什么?

看下图

个人解析:

AOP叫做面向切面编程,但是实际上就是面向方法编程

图中下面一部分是一个AOP的案例

AOP快速入门案例代码实现

案例:测出业务中各个业务方法所需的执行时间

如果我们一个个对每个方法进行改代码,这样太过繁琐,然后我们就引入进来了AOP

下面是对这个案例的代码实现

第一步:我们要引入springAOP的依赖

第二步:编写AOP的代码

代码分析:

@Aspect这个注解是意味,这个类为有关AOP的类,也就是切面类,待会会介绍概念

然年@Around注解,以及后面一大串,在下面已经解释

之后的一些代码就是计算运行时间的逻辑代码,无需多介绍

AOP核心概念

如下图

个人理解:

有些概念已经介绍的十分清晰,我就来分析一下不太清晰的概念

切入点和切入点表达式

这两个其实是紧密相连的,切入点表达式表达出来的正是切入点

更通俗的来说就是,这些可调用的连接点,切入点表达式表达出来的是连接点的其中一些,而满足切入点表达式的连接点,我们又叫做切入点

AOP执行顺序

假设我们现在是在测试list方法的运行时间,左上角是我们定义的切面类,而切入点表达式(不是图中的切入点表达式,我们只是假设)指向的list方法,那么list方法我们就叫做它为切入点

然后这个list所在的类的对象为目标对象

左下角采取依赖注入的方法注入的并不是目标对象,如果是这样的话,AOP就白写了

AOP最本质上是基于动态代理来实现的

所以目标对象会自动加载为右下角的那个代理对象,而代理对象里的list方法是加强后的方法

也就是能够获得运行时间的list方法

所有左下角注入的对象是代理对象

然后左下角利用代理对象调用的lst方法自然也是加强后的list方法了,这样就完成了案例要求

以上就是这个案例AOP的执行顺序

AOP进阶

通知类型

通知分为很多类型,以下图片为通知类型的介绍,内容比较详细

其实看文字意思就能够明白各个类型的区别

如果还是看不懂,可以参考下面图片中的代码,包含了所有的通知类型的测试

以上就是所有代码

然后我们要引入一个注释

由于有些时候切入点的表达式一直在重复,所以我们可以利用一个注解提取出来,请看下图

通知顺序

这个通知顺序,就很简单了,了解以下就是了

看下图

切入点表达式

我们之前都是了解什么是切入点表达式

接下来我们要了解切入点表达式是如何写的

切入点表达式的写法有两种形式,如下图

execution

下面图中第一行介绍的式它的语法结构

图中打了?的意思是,?之前的一个内容可以省略,注意我说的是前一个,而不是多个

但是我们一般不省略,直接写出它的完整格式来

下图下面,还介绍了表达式中常用的通配符,这样就可以大大简短了代码长度

这个十分重要,看下图的解释我们应该也能明白怎么用

下图是一些书写规范的建议,可看可不看,反正就是尽量少省略

@annotation

当我们使用execution来写表达式的时候难免会遇到一个表达式写不出来,需要两个表达式来写的,如下图

为了解决这个问题,我们就引入了这个@annotation表达式

这个切入点表达式如何来用呢?

第一步:创建一个annotation的类(不是普通的类和接口)

个人感觉这就像是自己定义以一个注解,

到后面就可以看出来

,如下图

第二步:书写该类的一些注释

对代码进行分析:

第一行的注解表示的是,在运行时生效

第二行注解表示的是作用的目标是方法

由于这个类就是起一个标记作用,所以不用再写多余的代码

第三步:给切点类做上标记

如下图的MyLog这个注解,这个是我们上面自己定义的类的名字

所以我个人感觉上面就像是自己定义了一个注解

最后一步:写切入点表达式

凡是被做了标记的,就都行

连接点

我们刚开始的AOP入门是测试方法的运行时间,但是我们有时候并不是这个要求

而是获取连接点的某个信息

接下来就是如何获取连接点方法的信息的方法

首先这个是要分通知类型的,分为两个部分,每个部分获取信息的方法略有不同

如下图有详细介绍

下图为@Around通知类型

下图为其他通知类型

然后下图便是我们如何具体实现代码

记住返回值改一下,不是null


http://www.mrgr.cn/news/20468.html

相关文章:

  • 如何撰写SCI作者同意发表函/版权转让协议
  • 海外盲盒APP系统开发,盲盒全球化发展机遇
  • 网工内推 | 富士康、移动,大厂网工,最高25K,IE认证优先
  • 2024 高教社杯 数学建模国赛 (C题)深度剖析|农作物的种植策略|数学建模完整代码+建模过程全解全析
  • 针对STM32串口输出乱码错误问题
  • uniapp解决页面跳转时,含有base64的数据丢失问题
  • LeetCode438. 找到字符串中所有字母异位词(2024秋季每日一题 11)
  • C++基础智能指针
  • Web入门-08.Tomcat-基本使用
  • 易保全出席人工智能应用场景高峰论坛,发布AI-数据资产管理平台2.0应用成果
  • 简单介绍 NVIDIA推出的图形处理单元(GPU)架构“安培架构“
  • 【JAVA数据结构】简单洗牌算法——ArrayList(顺序表)使用实例
  • 如何借助AI快速筛选和整理文献?
  • CSP-J/S 复赛程序提交指南,提交错误必爆零!!!
  • MySQL——数据类型
  • 【MATLAB源码-第164期】基于matlab的轴承故障三种谱图:细化谱,功率谱,倒谱对比分析仿真。
  • 【HTTP、Web常用协议等等】前端八股文面试题
  • nginx报错 open() “/usr/local/nginx/html/favicon.ico“ failed
  • WildCard平台:什么是 ChatGPT 随心用?什么是 Claude 随心用?什么是随心用全能套餐?
  • C语言刷题日记(附详解)(4)