SpringAop(1)

Spring中有两大重心:springIoc和springAop

springioc将bean的控制权交给了spring管理,直接从spring中获取,通过五大注解来告诉spring帮我管理这个对象。通过@Autowired和构造方法和set方法注入。

不仅仅是学习重点也是面试常考的难点。

springAop(难点):

aop是面向切面编程,和面向对象编程不是互斥也不是升级,而是补充。

什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程。
什么是⾯向特定⽅法编程呢? ⽐如上个章节学习的"登录校验", 就是⼀类特定问题。 登录校验拦截器, 就是对"登录校验"这类问题的统⼀处理。所以, 拦截器也是AOP的⼀种应⽤。 AOP是⼀种思想, 拦截器是AOP思想的⼀种实现。 Spring框架实现了这种思想, 提供了拦截器技术的相关接⼝。同样的, 统⼀数据返回格式和统⼀异常处理, 也是AOP思想的⼀种实现。 (我个人认为就是简称针对于大家很多时候都会遇到的一种问题进行编程,比如统一返回,对一类事情进行集中处理)。
AOP是⼀种思想, 它的实现⽅法有很多, 有Spring AOP,也有AspectJ、CGLIB等.

在这里我们想做一个Aop切面,让我们即使不用修改原本的代码也能够做到记录程序运行时间的方法。 

第一步:使用AOP要先引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

第二步:引入一个切面(一类特定问题)

package com.syx.book.aspect;import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Component
@Aspect
public class TimeRecordAspect {
}

引入@Aspect注解,spring使用了AspectJ(第三方的jar包,类似于lombok)注解,但是实际上是spring实现的。

package com.syx.book.aspect;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Aspect
public class TimeRecordAspect {//记录耗时//作用范围@Around()@Around("execution(* com.syx.book.Controller.*.*(..))")public Object timeRecord(ProceedingJoinPoint joinPoint) throws Throwable {long start=System.currentTimeMillis();Object proceed = joinPoint.proceed();long end=System.currentTimeMillis();log.info("耗时时间"+(end-start)+"ms");return proceed;}
}
这是创建了一个记录程序运行到结束的AOP类,@Around括号后边表示作用的范围:说明作用于scom.syx.book.Controller包中,后边第一个*表示所有类,第二个*表示所有方法。

在这里就可以看到,我们并没有在原本代码上面改变,但是却能够同样实现时间耗时功能。

1. @Aspect: 标识这是⼀个切⾯类
2. @Around: 环绕通知, 在⽬标⽅法的前后都会被执⾏. 后⾯的表达式表⽰对哪些⽅法进⾏增强.(侵入程序的时机,目标前后都会执行)
3. ProceedingJoinPoint.proceed() 让原始⽅法执⾏


springAop核心概念介绍:

1.切点:一种规则
Pointcut 的作⽤就是提供⼀组规则 (使⽤ AspectJ pointcut expression language 来描述), 告诉程序对哪些⽅法来进⾏功能增强。也就是@Around后边的字符串,描述了在哪里进行切入。对哪些的方法进行功能增强。(告诉哪些能被连接成切面,哪些不能被连接成切面,哪些能被Aop认识到,就是寻找匹配项)。
2.连接点:符合规则的对象

与切点的关系:切点是对连接点的一种筛选。所有的连接点构成了程序执行过程中的可能的关注点,而切点则用于从这些众多的连接点中挑选出符合特定条件的那些点,然后在这些挑选出来的连接点上应用切面的通知。

3.通知:方法内部的逻辑

表示连接点具体要做的事情(也就是方法里面咱们程序员写的逻辑等等),被叫做方法。 

通知的几种类型:
  1. @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
  2. @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
  3. @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
  4. @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执行
  5. @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏
4.切面:符合规则做的事情

切点+连接点+通知=切面。


通知的几种介绍:
1.before和after同理 :

这是切面的设置以及切面的逻辑

package com.syx.aop.aspect;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Slf4j
@Component
@Aspect
public class AspectDemo {//作用的范围是TestController@Before("execution(* com.syx.aop.Controller.*.*(..))")public void doBefore(){log.info("do before..........");}}
package com.syx.aop.Controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class TestController {@RequestMapping("doBefore")public String t1(){return "t1";}
}

下面表示调用t1方法然后就会打印日志。

doBefore是在程序执行之前打印。

2.Around

around是要求我们在切面配置的时候要求我们要返回一个object

@Around("execution(* com.syx.aop.Controller.*.*(..))")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {log.info("do Around.............");Object proceed = joinPoint.proceed();log.info("do Around.............");return proceed;}}

Around必须要有返回函数。否则会没有返回值

在这里我们会发现假如同时配置了before after和around时候,around会优先执行。

3.AfterReturn 

当接口正常的时候会先执行afterreturn

5.AfterThrowing

如果有异常的话比如在这里我们调用的时候出现了一个算数异常10/0,就不会执行AfterReturn和最后的Around而是直接执行AfterThrowing。

before和after不管咋样都会执行。

在这里的@Aspect中就有很多切面类。

6.pointcut

描述切点,在这里通过注释@pointcut描述

@Slf4j
@Component
@Aspect
public class AspectDemo {@Pointcut("execution(* com.syx.aop.Controller.*.*(..))")public void pt(){}//作用的范围是TestController@Before("pt()")public void doBefore(){log.info("do before..........");}

在下面在注解后写入pt()即可 。

如果其他类中需要使用这里的pt()方法必须要指定路径,,全限定路径。

如果有多个切面作用在同一个切点上,就会按照名称进行排序。这时候我们要用@order注解

7.order

数字越大级别越低,before的时候数字越小先执行。

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

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

相关文章

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

Nginx:ssl

目录 部署ssl前提 nginx部署ssl证书 部署ssl部署建议 部署ssl前提 网站有域名根据域名申请到ssl证书&#xff0c;并下载证书部署到nginx中 部署了ssl证书后&#xff0c;访问的流量是加密的。 nginx部署ssl证书 #80端口跳转到443 server {listen 80;return 302 https://1…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

[TPAMI 2024]Vision-Language Models for Vision Tasks: A Survey

论文网址&#xff1a;Vision-Language Models for Vision Tasks: A Survey | IEEE Journals & Magazine | IEEE Xplore 论文Github页面&#xff1a;GitHub - jingyi0000/VLM_survey: Collection of AWESOME vision-language models for vision tasks 英文是纯手打的&…

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口&#xff1f;6.2 个人电脑的网关本质是什么&#xff1f; 0. 概念 自治系统&#xff…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…

介绍下你们电商搜索的整体Java技术架构?

大家好&#xff0c;我是锋哥。今天分享关于【介绍下你们电商搜索的整体Java技术架构&#xff1f;】面试题。希望对大家有帮助&#xff1b; 介绍下你们电商搜索的整体Java技术架构&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在电商平台的搜索系统中…

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例&#xff0c;其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

永磁同步电机负载估计算法--滑模扰动观测器

一、原理介绍 为了进一步提高永磁同步电机的抗干扰性能&#xff0c;采用SMDO在线估计负载扰动&#xff0c;然后将估计的负载扰动作为前馈信号补偿速度控制器的输出 根据永磁同步电机的运动方程&#xff0c;可以建立滑模观测器的模型如下&#xff1a; 式中l2为观测器的反馈增益…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…

云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]

碰见的三个问题&#xff1a; 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考&#xff1a;遇见问题&#xff0c;第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1&#xff1a;找到known_hosts文件并编辑 步骤 2&#xff1a;通过VSCode终端输入…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

基于BM1684的AI边缘服务器-模型转换,大模型一体机

介绍 我们属于SoC模式&#xff0c;即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译&#xff0c;部署时将编译好的程序拷贝至SoC平台&#xff08;1684开发板/SE微服务器/SM模组&#xff09;中执行。 注&#xff1a;以下都是在Ubuntu20.04系统上操…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

计算机网络——不同版本的 HTTP 协议

介绍 HTTP&#xff0c;即超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;是应用层的一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…

P1319 压缩技术 P1320 压缩技术(续集版)

题目传送门 P1319 压缩技术 P1320 压缩技术&#xff08;续集版&#xff09; P1319 压缩技术 输入格式 数据输入一行&#xff0c;由空格隔开的若干个整数&#xff0c;表示压缩码。 其中&#xff0c;压缩码的第一个数字就是 N N N&#xff0c;表示这个点阵应当是 N N N\t…