[spring]Spring AOP 及 代理模式

news2024/11/27 6:53:52

文章目录

  • 一. 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中每个方法的执行时间

@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核心概念

切点

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

连接点

在这里插入图片描述

@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注解标识的类)

通知类型

在这里插入图片描述

@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

在这里插入图片描述

 @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的方式来描述哪些方法需要切面
在这里插入图片描述

自定义注解

在这里插入图片描述

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

在这里插入图片描述

使用@annotation

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

@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.coloradmin.cn/o/2206943.html

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

相关文章

算法笔记day03

目录 1. 大数加法 2.链表相加(二) 3.大数乘法 1. 大数加法 大数加法_牛客题霸_牛客网 算法思路&#xff1a; 这就是一道模拟题&#xff0c;模拟加法列竖式运算的过程。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0…

大模型存储选型 JuiceFS 在关键环节性能详解

从去年开始&#xff0c;LLM大语言模型领域发展迅速、如 LLaMA、ChatGLM、Baichuan、Qwen 和 yi-model 等基础模型&#xff08;Foundation Models&#xff09;的数量显著增加。众多企业也开始基于这些基础模型做 post-training 的相关工作&#xff0c;以开发特定垂直领域的模型实…

唯一客服浏览器插件: 视频号直播自动回复与循环发送话术-自动化插件

唯一客服浏览器插件 gofly.v1kf.com 我们在做视频号直播的时候&#xff0c;会有这种自动回复咨询问题的功能唯一客服浏览器插件现在就支持&#xff0c;在视频号直播后台&#xff0c;自动化回复用户问题&#xff0c;以及循环发送我们的介绍话术

vscode gitlens收费破解

首先打开vscode 插件栏 搜索GitLens 找到对应插件 这里我已经安装完成&#xff0c;如果未安装的点击install 并且下载指定版本V15.1.0 不然后续操作 不生效 找到对应面板 点击查看GitLens 安装完成后&#xff0c;并不能立即使用 显示一下内容&#xff0c;需要付费 这里很关键&…

Breach 2.1靶机渗透

项目地址 plain https://download.vulnhub.com/breach/Breach-2_final2.1.zip 实验过程 根据靶机的描述得知该靶机适用于静态ip&#xff0c;即192.168.110.151 配置虚拟机的虚拟网络编辑器的仅主机模式&#xff0c;将其子网IP配置在110网段&#xff0c;并将攻击机kali和靶机…

VSCode连接本地的虚拟机的一遍过步骤

一. 首先要在虚拟机的Linux上安装 openssh-server 1. 安装 sudo apt-get remove openssh-server # 先卸载&#xff0c;无论咋样都先做一下&#xff0c;以免出现问题 sudo apt-get install openssh-server # 安装 sudo service ssh --full-restart # 重启ssh 服务…

Java 17 面向对象编程(基础篇),快速了解面试对象编程

小熊学Java​站点&#xff1a;https://www.javaxiaobear.cn 本章汇总 学习面向对象内容的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类 面向对象的特征&#xff1a;封装、继…

servlet基础与环境搭建(idea版)

文章目录 环境变量配置安包装环境变量配置JDK 配置 静态网页动态网页&#xff08;idea&#xff09;给模块添加 web框架新版本 2023 之后的 idea&#xff0c;使用方法二idea 目录介绍建立前端代码启动配置 环境变量配置 tomcat 环境变量 安包装 环境变量配置 JDK 配置 静态网页…

GA-BP回归预测 | MATLAB实现GA-BP多输入单输出回归预测

回归预测 | MATLAB实现GA-BP多输入单输出回归预测 目录 回归预测 | MATLAB实现GA-BP多输入单输出回归预测预测效果基本介绍模型描述遗传算法神经网络GA-BP网络程序设计学习总结参考资料预测效果 基本介绍 MATLAB实现GA-BP多输入单输出回归预测,输入7个特征,输出1个,优化权重…

Meta发布高质量3D物体重建数据集:推动空间计算与XR技术的发展

Meta(原Facebook)近日宣布推出一个全新的高质量3D物体重建数据集——Digital Twin Collection (DTC),旨在推动空间计算、扩展现实(XR)、智能眼镜以及基于AI的3D重建研究。该数据集包含超过2,400个物理对象的3D模型,具有亚毫米级的几何精度和高度逼真的视觉效果。本文将详…

electron-vite打包踩坑记录

electron-vite打包踩坑记录 大前端已成趋势&#xff0c;用electron开发桌面端应用越来越普遍 近期尝试用electronvite开发了个桌面应用&#xff0c;electron-vite地址&#xff0c;可用使用vue开发&#xff0c;vite打包&#xff0c;这样就很方便了 但是&#xff0c;我尝试了一…

vue后台管理系统从0到1(3)element plus 的三种导入方式

文章目录 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式element plus 引入方式完整引入按需导入手动导入 vue后台管理系统从0到1&#xff08;3&#xff09;element plus 的三种导入方式 element plus 引入方式 官方网址&#xff1a;https://el…

51单片机的万年历【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块按键蜂鸣器等模块构成。适用于电子万年历、数字时钟万年历等相似项目。 可实现功能: 1、LCD1602实时显示年月日星期和北京时间&#xff0c;具备闰年判断功能 2、按键可设置闹钟时间 3、按键可修改当前时…

vue后台管理系统从0到1(2)

文章目录 vue后台管理系统从0到1&#xff08;2&#xff09;前端项目构建nodejs版本开始构建 vue vite 项目项目清理项目依赖安装配置别名配置路由 vue-router vue后台管理系统从0到1&#xff08;2&#xff09; 前端项目构建 nodejs版本 因为我们是要构建一个 vue vite 的前…

Mycat引领MySQL分布式部署新纪元:性能与扩展性的双重飞跃

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

滚花螺纹的工艺

滚花是一种车加工的加工方法&#xff0c;目的是增加零件表面的摩擦力&#xff0c;例如&#xff1a;千分尺的旋钮位置就滚花了&#xff0c;这样手在转动旋钮时不会打滑。滚花使用是滚花刀&#xff0c;滚花并不是去除零件表面材料&#xff0c;而是使用滚花刀挤压零件表面&#xf…

决战Linux操作系统

前言&#xff1a; 你是否也曾经为Linux所困扰过&#xff0c;在网上找的资料零零散散&#xff0c;是否学完Linux后还是懵懵懂懂&#xff0c;别怕&#xff0c;这篇博客是博主精心为你准备的&#xff0c;现在&#xff0c;就让我们一起来走进Linux的世界&#xff0c;决战Linux&…

软件性能测试概述

1. 常见的性能问题 访问12306的时候&#xff0c;由于访问量过高导致该app系统崩了&#xff1b; 2. 性能测试 测试人员借助测试工具&#xff0c;模拟系统在不同的场景下&#xff0c;对应的性能指标是否达到预期&#xff1b; 3. 性能测试和功能测试 功能测试&#xff1a;人工来完…

智能制造与精益制造的模型搭建

现行制造模式分析I-痛点改善思路-管控省优四化推行

Github上的Markdown语法详解

今天在看Win32文档参与编写的说明时&#xff0c;看到里面提及 Our documentation is written in Markdown, a lightweight text style syntax. If youre not familiar with Markdown, you can learn the basics on GitHub. When unsure, 刚好&#xff0c;今天就来做个全面的总…