[spring]Spring AOP 及 代理模式

news/2024/10/12 14:12:12/

文章目录

  • 一. AOP介绍
  • 二. AOP使用
    • Spring AOP核心概念
      • 切点
      • 连接点
      • 通知
      • 切面
    • 通知类型
    • @PointCut
    • 切面优先级@Order
    • 切点表达式
      • execution(....)
      • @annotation
        • 自定义注解
        • 使用@annotation
        • 添加自定义注解
  • 三. 代理模式

一. AOP介绍

Spring框架两大核心:

  1. IoC
  2. AOP
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二. AOP使用

  1. 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
  1. 编写AOP程序
    记录Controller中每个方法的执行时间
java">
@Slf4j
@Aspect
@Component
public class TimeAspect {@Around("execution(* com.example.demo.controller.*.*(..))")public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始时间long begin = System.currentTimeMillis();//执行方法Object result = pjp.proceed();//记录执行方法结束时间long end = System.currentTimeMillis();//记录方法执行耗时log.info(pjp.getSignature() + "耗时: {} ms",end-begin);return result;}
}

在这里插入图片描述

Spring AOP核心概念

切点

在这里插入图片描述
在这里插入图片描述
这就是切点表达式

连接点

在这里插入图片描述

java">@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("/t1")public String t1() {return "t1";}@RequestMapping("/t2")public Boolean t2() {return true;}@RequestMapping("/t3")public Integer t3() {return 1;}
}

这些方法都是连接点

通知

在这里插入图片描述
在这里插入图片描述

切面

在这里插入图片描述
在这里插入图片描述
切⾯所在的类,我们⼀般称为切⾯类(被@Aspect注解标识的类)

通知类型

在这里插入图片描述

java">@Slf4j
@Aspect
@Component
public class TimeAspect {@Around("execution(* com.example.demo.controller.*.*(..))")public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始时间long begin = System.currentTimeMillis();//执行方法Object result = pjp.proceed();//记录执行方法结束时间long end = System.currentTimeMillis();//记录方法执行耗时log.info(pjp.getSignature() + "耗时: {} ms",end-begin);return result;}@Before("execution(* com.example.demo.controller.*.*(..))")public void doBefore(){log.info("执行before方法");}@After("execution(* com.example.demo.controller.*.*(..))")public void doAfter(){log.info("执行After方法");}@AfterReturning("execution(* com.example.demo.controller.*.*(..))")public void doAfterReturning(){log.info("执行AfterReturning方法");}@AfterThrowing("execution(* com.example.demo.controller.*.*(..))")public void doAfterThrowing(){log.info("执行AfterThrowing方法");}@Around("execution(* com.example.demo.controller.*.*(..))")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {log.info("Around方法开始前");Object object = joinPoint.proceed();log.info("Around方法开始后");return object;}
}

测试:
在这里插入图片描述
在这里插入图片描述

发生异常:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@PointCut

在这里插入图片描述

java"> @Pointcut("execution(* com.example.demo.controller.*.*(..))")public void pt(){}@Before("pt()")public void doBefore(){log.info("执行before方法");}

在这里插入图片描述

切面优先级@Order

现有两个切面类, 分别有before和after方法, 那么方法的执行顺序为:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

切点表达式

在这里插入图片描述

execution(…)

execution() 是最常⽤的切点表达式,⽤来匹配⽅法,语法为:

execution(<访问修饰符> <返回类型> <包名.类名.⽅法(⽅法参数)> <异常>)

其中:访问修饰符和异常可以省略
在这里插入图片描述
在这里插入图片描述

@annotation

可是使用自定义注解和@annotation的方式来描述哪些方法需要切面
在这里插入图片描述

自定义注解

在这里插入图片描述

java">@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAspect {
}

在这里插入图片描述

使用@annotation

使用@annotation来描述自定义注解, 放在切点表达式中
表示, 只有加了自定义注解的方法, 才是连接点

java">@Aspect
@Component
@Slf4j
public class MyAspectDemo {@Around("@annotation(com.example.demo.aspect.MyAspect)")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {log.info("方法前");Object object = joinPoint.proceed();log.info("方法后");return object;}
}

在这里插入图片描述

添加自定义注解

在这里插入图片描述

只给t3加注解, 测试:
在这里插入图片描述

三. 代理模式

在这里插入图片描述
使用代理前:
在这里插入图片描述
使用代理后:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

静态代理:在程序运⾏前,代理类的.class⽂件就已经存在了
相⽐于静态代理来说,动态代理更加灵活
在这里插入图片描述
Spring AOP是基于动态代理实现的
Java也对动态代理进⾏了实现,并给我们提供了⼀些API,常⻅的实现⽅式有两种:
在这里插入图片描述
JDK动态代理有⼀个最致命的问题是其只能代理实现了接⼝的类
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1537901.html

相关文章

flutter打包后如何看打印信息

一、确保设备已连接并被识别 首先&#xff0c;确保你的手机已经通过 USB 连接到电脑&#xff0c;并且 USB 调试&#xff08;Android&#xff09;或开发者模式&#xff08;iOS&#xff09;已经启用。在终端输入以下命令&#xff0c;查看设备是否已被识别&#xff1a; flutter d…

时序逻辑-延一拍/打一拍?

一、时序逻辑中的同步复位和异步复位 同步复位的D触发器 同步复位的D触发器中的“同步”是和工作时钟同步的意思&#xff0c;也就是说&#xff0c;当时钟的上升沿&#xff08;也可以是下降沿&#xff0c;一般习惯上为上升沿触发&#xff09;来到时检测到按键的复位操作才有效&a…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

深入理解 Django 自定义用户模型

1. 引言 Django 作为一个强大的 Web 框架&#xff0c;内置了用户认证系统。然而&#xff0c;实际项目中我们通常需要扩展用户模型&#xff0c;以满足不同的业务需求。Django 提供了继承 AbstractUser 的方式&#xff0c;让我们能够轻松地定制用户模型。本文将通过一个自定义用…

R中线性回归及其权重和截距的计算

以下是您提供的代码的总结和解析&#xff0c;主要聚焦于线性回归及其权重和截距的计算。 代码解析 数据准备&#xff1a; data women使用内置的 women 数据集&#xff0c;该数据集包含了身高和体重的信息。 绘制散点图&#xff1a; plot(women$height, women$weight,xlab &…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接&#xff08;三次握手&#xff09; HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

力扣题11~20

题11&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 这种题目第一眼就是双循环&#xff0c;但是肯定不行滴&#xff0c;o(n^2)这种肯定超时&#xff0c;很难接受。 所以要另辟蹊径&#xff0c;我们先用俩指针&#xff08;标志位&#xff09;在最左端和最右端&am…

Unity3D游戏的内存控制详解

Unity3D是一款流行的游戏引擎&#xff0c;支持多种平台&#xff0c;包括PC、移动设备和VR等。随着游戏的复杂性不断提高&#xff0c;Unity3D的内存管理变得尤为重要。本文将详细介绍Unity3D游戏中的内存控制技术&#xff0c;包括自动内存管理、对象池、延迟加载资源和手动清理资…