面向切面编程(SpringAOP)、通过注解实现AOP代码、AOP的工作流程

news2024/11/25 10:35:56

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaweb

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


SpringAOP

  • 一、AOP简介
    • 1.1连接点(JoinPoint)
    • 1.2切入点(Pointcut)
    • 1.3通知(Advice)
    • 1.4通知类
    • 1.5切面(Aspect)
  • 二、AOP入门(注解版)
    • 2.1导入aop相关坐标
    • 2.2定义接口与实现类
    • 2.3定义通知类
    • 2.4定义切入点
    • 2.5绑定切入点与通知关系
    • 2.6定义通知类受Srpring容器管理
    • 2.7开启Spring对AOP注解驱动支持
  • 三、AOP的工作流程
  • 四、AOP切入点表达式(了解)

一、AOP简介

  • AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构
    • OOP(Object Oriented Programming)面向对象编程
  • 作用:在不惊动原始设计的基础上为其进行功能增加
  • Spring理念:无入侵式/无侵入式

1.1连接点(JoinPoint)

  • 程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
    • 在springAOP中,理解为方法的执行

1.2切入点(Pointcut)

  • 匹配连接点的式子
    • 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
      • 一个具体方法:com.practice包下的BookDao接口中的无形参无返回值的save方法
      • 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

1.3通知(Advice)

  • 在切入点处执行的操作,也就是共性功能
    • 在SpringAOP中,功能最终以方法的形式呈现

1.4通知类

  • 定义通知的类

1.5切面(Aspect)

  • 描述通知与切入点的对应关系

二、AOP入门(注解版)

2.1导入aop相关坐标

<dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
</dependency>
  • pring-context坐标依赖spring-aop坐标
    在这里插入图片描述

2.2定义接口与实现类

public interface BookDao {
    void save();
    void update();
}
@Repository
public class BookDaoImpl implements BookDao {
    public void save() {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            System.out.println("book dao save...");
        }
        long end = System.currentTimeMillis();
        System.out.println("共消耗时间:" + (end - start) + "ms");
    }

    public void update() {
        System.out.println("bookDao update...");
    }

2.3定义通知类

public class MyAdvice {
    @Before()
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

2.4定义切入点

public class MyAdvice {
    @Pointcut("execution(void com.practice.dao.BookDao.update())")
    private void pt(){}
}
  • 切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值,方法体无实际逻辑

2.5绑定切入点与通知关系

  • 指定通知添加到原始连接点的具体执行位置
public class MyAdvice {
    @Pointcut("execution(void com.practice.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

2.6定义通知类受Srpring容器管理

  • 定义当前类为切面类(添加注解)
@Component
@Aspect
public class MyAdvice {

    @Pointcut("execution(void com.practice.dao.BookDao.update())")
    private void pt(){}
    @Before("pt()")
    public void method() {
        System.out.println(System.currentTimeMillis());
    }
}

2.7开启Spring对AOP注解驱动支持

@Configuration
@ComponentScan("com.practice")
@EnableAspectJAutoProxy
public class SpringConfig {
}

三、AOP的工作流程

  • 1.Spring容器启动
  • 2.读取所有切面配置中的切入点
  • 3.初始化bean,判定bean对应的类中的方法是否匹配到任意切入点
      • 匹配失败,创建对象
      • 匹配成功,创建原始对象的(目标对象)的代理对象
  • 4.获取bean执行方法
      • 获取bean,调用方法并执行,完成操作

四、AOP切入点表达式(了解)

  • 切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)

    • 访问修饰符:public、private,可以省略
    • 异常:可以省略
  • *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

execution(public * com.practice.*.UserService.find*(*))
  • 匹配com.practice包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
  • ..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById(..))
  • 匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

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

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

相关文章

IntelliJ IDEA 2023.1.3 主菜单不见了

通过以下操作&#xff0c;去掉了勾&#xff0c;把主菜单玩没了 然后主菜单找半天都不知道怎么回来&#xff0c;下面记录找回来的过程 双击shift&#xff0c;在弹出的菜单里面搜索 "main menu"&#xff0c;在下图高亮位置选项改为 on

火警智能感知定位 智慧消防大数据可视化监测系统

伴随着城市建设的快速发展&#xff0c;城市消防安全风险的不断上升&#xff0c;城市高层、超高层建筑和大型建筑日益增多&#xff0c;建筑消防安全问题越来越突出。 建设背景 市场背景 近年来&#xff0c;我国多数省级以上城市、90%左右地级以上城市均提出了智慧消防建设计划…

无涯教程-jQuery - width( )方法函数

width()方法获取第一个匹配元素的当前计算像素宽度。 width( ) - 语法 selector.width( ) 此方法能够找到窗口和文档的宽度&#xff0c;如下所示: $(window).width(); //返回浏览器窗口的宽度 $(document).width(); //返回 HTML 文档的宽度 width( ) - 示例 <html&g…

如何用C#实现上位机与下位机之间的Wi-Fi通信?

有IP协议支持的话用UDP报文或者TCP直接发IP地址和端口不行么&#xff1f;你说的WiFi难道是2.4GHz频率模块那种东东&#xff1f; 你既然用了wifi&#xff0c;那么只要上位机和下位机的对应wifi网卡都具有ip地址以及其协议支持&#xff0c;那么和网络编程没啥子明显区别的吧………

pycharm制作柱状图

Bar - Bar_rotate_xaxis_label 解决标签名字过长的问题 from pyecharts import options as opts from pyecharts.charts import Barc (Bar().add_xaxis(["高等数学1&#xff0c;2","C语言程序设计","python程序设计","大数据导论",…

MBA拓展有感-见好就收,还是挑战到底?MBA拓展有感-见好就收,还是挑战到底?

今天看到新闻提到某位坚持了14年高考的同学滑档&#xff0c;让人心生感叹&#xff1a;无论在日常工作还是生活中&#xff0c;选择都是非常重要的。不由想起前段时间我参加研究生新生拓展时的一些感悟&#xff0c;和大家分享一下。 事情的起因是拓展活动中的一个分队竞技类的活…

利用DIE、de4dot和dnspy进行反编译

1.数据准备 1.软件 知云翻译7.0这个版本好破解&#xff0c;该软件是C#写的程序 DIE&#xff08;Detect it Easy&#xff09;该软件是进行查看软件的壳及编译程序&#xff0c;详细了解EXE软件 de4dot是对PE进行脱壳处理&#xff0c;源码下载链接&#xff1a;GitHub - de4dot…

JAVA开发工具-maven的安装与配置(最新最详细教程)

引言 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具 软件。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较 高的可重用性&#xff0c;所以常常用两…

lc1074.元素和为目标值的子矩阵数量

创建二维前缀和数组 两个for循环&#xff0c;外循环表示子矩阵的左上角&#xff08;x1,y1&#xff09;&#xff0c;内循环表示子矩阵的右下角&#xff08;x2,y2&#xff09; 两个for循环遍历&#xff0c;计算子矩阵的元素总和 四个变量&#xff0c;暴力破解的时间复杂度为O(…

点云处理——terrasolid教程

加载terrasolid软件模块 3、通过microstation的utilities->mdl applications加载terrasolid四个模块,加载成功后将显示tscan和tphoto的主窗口&#xff0c;以及四个模块的主工具箱。 浏览点云 4、显示点云坐标信息(类&#xff0c; 航带号&#xff0c;GPS信息&#xff0c;东…

小夜灯的体势红外传感器 > 红外知识学习

红外是电磁辐射谱中的一部分&#xff0c;它位于可见光谱的红色边缘之外&#xff0c;具有较长的波长。可见光谱是人眼能够感知的电磁辐射范围&#xff0c;而红外光的波长较长&#xff0c;人眼无法感知。 生命光的范围是6~14um 红外光的波长范围一般约为0.7um~1000um&#xff08;…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

打通数据治理全链路,火山引擎DataLeap数据治理平台公有云版本正式发布

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎DataLeap正式对外发布数据治理平台公有云版。DataLeap是火山引擎大数据研发治理套件&#xff0c;随着其子套件数据治理平台与CDH引擎底座成…

等待已久,新品上市 | RevPi Connect 4系列:基于树莓派CM4计算模块的全新工业树莓派

新品来袭 势不可挡 备受期待的虹科工业树莓派第四代产品—RevPi Connect 4终于来啦&#xff01;作为全球领先的工业自动化产品&#xff0c;RevPi Connect 4融合了工业树莓派多年技术积累与创新突破&#xff0c;以及现代物联网技术的结晶。无论您是行业领先者、工程师还是智能科…

tinkerCAD案例:29. 摇头娃娃

Research Your Favorite Bobblehead 摇头娃娃 Project Overview: 项目概况&#xff1a; Design and create your favorite Minecraft 3D bobble head. All you need is a computer, 3D printer, spring and your creativity to your favorite Minecraft character in the for…

远程访问本地mysql

文章目录 一、设置本地mysql允许外部访问找到mysql配置文件my.ini &#xff0c;linux环境是my.cnf配置mysql配置文件 二、创建外部访问的mysql用户三、配置mysql用户的权限四、配置防火墙端口五、连接查看本地ip地址 参考 连接命令 mysql -h <host> -P <port> -u &…

Hive/Spark/Yarn: User Not Found 错误和 Kerberos / AD / OpenLDAP 之间的关系与解释

有时候,当你向Spark或Hive提交作业时,可能会遇到如下的错误: 提交作业使用的用户是example-user-1,但是Yarn返回的错误信息是:该用户不存在。类似的问题大多发生在启动了Kerberos的Hadoop集群上,或者集群集成了Windows AD或OpenLDAP后。本文,我们把这个问题梳理清楚并给…

【MySQL】触发器 (十二)

🚗MySQL学习第十二站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.引入 触发器是与表有关的数据库对象,作用在insert/update/delete语句执行之前(BEFORE)或之后(AFTER),自动触发并执行触发器中定义的SQL语句集合。它可以协助应…

从SQL注入绕过最新安全狗WAF中学习fuzz

前言 SQL注入并不是很精通&#xff0c;通过实战绕过WAF来进行加强SQL注入能力&#xff0c;希望对正在学习的师傅能有一丝帮助。 安装 安装前言 我是本地搭建的环境进行测试的 环境是windows11phpstudy2018sqli-labs phpstudy的安装我不再复述&#xff0c;这里简单说一下安全…

java 企业工程管理系统软件源码 自主研发,工程行业适用

&#xfeff; 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据…