当前位置: 首页 > 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微知-BIOS中的XHCI模式是什么意思?(usb3.0的扩展控制器影响usb3.0速率等选项)
  • Android之同一个Thread线程里只能有一个Looper?(ThreadLocal)
  • 计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 前端面试八股文
  • 部署Apache网站
  • 828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署GitLab服务器
  • 调度器怎么自己写?调度器在实现时需要注意哪些细节?请写一个jvm的调度器?如何在这个调度器中添加多个任务?
  • 【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)
  • ffmpeg面向对象-待定
  • 2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp
  • AWQ量化(Activation-aware Weight Quantization)
  • 本地运行 Qwen2-VL
  • 函数式编程思想
  • 第十一周:机器学习
  • 基于stm32f407的跟随行驶系统项目报告(利用openmv+超声波模块)
  • 【EOS】Cleos基础
  • Android Studio:GIT提交项目到远程仓库
  • CentOS6 编译安装 redis-3.2.3
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux快速复制或删除大量小文件
  • Material Design
  • Solarized Scheme
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • WePY 在小程序性能调优上做出的探究
  • 来,膜拜下android roadmap,强大的执行力
  • 浏览器缓存机制分析
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 找一份好的前端工作,起点很重要
  • 自定义函数
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ()、[]、{}、(())、[[]]命令替换
  • (1)Jupyter Notebook 下载及安装
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (7) cmake 编译C++程序(二)
  • (javaweb)Http协议
  • (JS基础)String 类型
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (十二)Flink Table API
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)http-server应用
  • (转)nsfocus-绿盟科技笔试题目
  • (转)项目管理杂谈-我所期望的新人
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .form文件_SSM框架文件上传篇
  • .htaccess 强制https 单独排除某个目录
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Project Open Day(2011.11.13)
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net程序集学习心得
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数