【Spring 深入学习】AOP的前世今生之后续

news2024/11/22 22:13:30

AOP的前世今生之后续

1. 概述

上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP

2. 什么是AOP

是面向切面编程,一般可以帮助我们在不修改现有代码的情况下,对程序的功能进行拓展,往往用于实现 日志处理,权限控制,性能检测,事务控制等

3. 核心概念

  • 连接点
  1. 类里面那些可以被增强的方法,这些方法称之为连接点
  2. 表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point

在这里插入图片描述
上述的方法都可以称之为连接点。

  • 切入点
  1. 实际被增强的方法,称之为切入点
  2. 表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方

在这里插入图片描述

虽然上述的截图中存在两个方法,但是实际只会增强一个方法,就是addUser. 这个方法就是切入点

  • 目标对象
  1. 实际增强的逻辑部分称为通知 (增加的功能)
  2. Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
    通知类型: 1 前置通知 2 后置通知 3 环绕通知 4 异常通知 5 最终通知

在这里插入图片描述
这种实际被作用的方法就是目标对象

  • 切面

表现为功能相关的一些advice方法放在一起声明成的一个Java类

在这里插入图片描述
整个类文件DaoAspect 其实就是切面

  • 织入

创建代理对象并实现功能增强的声明并运行过程

4. 多种AOP方式

@Component
@Aspect
public class DaoAspect {

    @Pointcut(value = "execution(* plus.chendd.dao.UserDao.addUser(..))")
    public void addPointCut() {}

    /**
     * 前置通知
     * @param joinPoint
     */
    @Before("addPointCut()")
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("beforeMethod ... 前置通知");
        Object[] args = joinPoint.getArgs();
        System.out.println(args);
    }

    /**
     * 后置通知 无论结果是否异常 都会执行
     */
    @After("addPointCut()")
    public void afterMethod() {
        System.out.println("afterMethod ... 后置通知");
    }

    /**
     * 返回通知 被代理方法执行后 执行此方法,如果发生了异常 不执行此方法
     * @param joinPoint
     * @param res
     */
    @AfterReturning(value = "addPointCut()", returning = "res")
    public void afterMethodReturning(JoinPoint joinPoint, Object res) {
        System.out.println(res);
        System.out.println("afterMethodReturning ... 返回通知");
    }

    /**
     * 异常通知 如果方法一旦发生了异常 执行此方法
     * @param ex
     */
    @AfterThrowing(value = "execution(* plus.chendd.dao.UserDao.updateUser(..))", throwing = "ex")
    public void methodAfterThrowing(Exception ex) {
        System.out.println("methodAfterThrowing ... 异常通知");
    }

    /**
     * 环绕通知:被代理的方法执行前后 都会执行此方法
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around(value = "addPointCut()")
    public Object methodAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("methodAround ... 环绕通知 前");
        Object o = proceedingJoinPoint.proceed();
        System.out.println("methodAround ... 环绕通知 后");
        return o;
    }
}

运行结果

在这里插入图片描述

结论

环绕通知(前) > 前置通知 > 返回通知 > 后置通知 > 环绕通知(后)

5. 开启AOP多种方式

通过配置文件

@Configuration
@ComponentScan(basePackages = "plus.chendd")
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class SpringConfig {
}

代码@EnableAspectJAutoProxy(proxyTargetClass = true) 用来开启AOP的

通过xml文件

<!--创建对象--> 
<bean id="userDao" class="com.com.msb.UserDaoImpl"></bean> 
<bean id="daoAspect" class="com.com.aspect.DaoAspect"></bean>

 <!--配置aop增强-->
 <aop:config>
     <!--切入点-->
     <aop:pointcut id="pointCutAdd" expression="execution(* com.msb.dao.UserDao.add*(..))"/>
     <!--配置切面-->
     <aop:aspect ref="daoAspect">
         <!--增强作用在具体的方法上-->
         <aop:before method="methodBefore" pointcut-ref="pointCutAdd"/>
         <aop:after method="methodAfter" pointcut-ref="pointCutAdd"/>
         <aop:around method="methodAround" pointcut-ref="pointCutAdd"/>
         <aop:after-returning method="methodAfterReturning"  pointcut-ref="pointCutAdd" returning="res"/>
         <aop:after-throwing method="methodAfterThrowing"  pointcut-ref="pointCutAdd" throwing="ex"/>
     </aop:aspect>
 </aop:config>

6. 结论

Spring 两大核心思想就是IOC, AOP. AOP的重要性可想而知啊。所以上述的知识掌握是非常有必须要的。具体的实例参照 demo 源码

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

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

相关文章

Java中字符流(FileReader(read、close)、FileWriter(write、close)、字符(输入、输出)流原理解析)

1.创建对象&#xff1a; 2.读取数据 3.释放资源&#xff08;关流&#xff09; 如何使用重载的read()方法呢&#xff1f; FileWriter&#xff1a; 在前面我们指导&#xff0c;字节输出流和字符输出流的本质区别是&#xff0c;字节输出流一次只能操作一个字节&#xff0c;如果让…

QEMU启动ARM32 Linux内核

目录前言前置知识ARM Versatile Express开发板简介ARM处理器家族简介安装qemu-system-arm安装交叉编译工具交叉编译ARM32 Linux内核交叉编译ARM32 Busybox使用busybox制作initramfs使用QEMU启动ARM32 Linux内核模拟vexpress-a9开发板模拟vexpress-a15开发板参考前言 本文介绍采…

【数据库】数据库基础架构

数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统&#xff0c;因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层&#xff0c;一个是Server层&#xff0c;另一个是存储引擎层&#xff0c;而我们常用的就是MyISAM、InnoDB&#xff0c;主要负…

16、字符串生成器

目录 &#xff08;1&#xff09;append()方法 &#xff08;2&#xff09;insert(int offset, arg)方法 &#xff08;3&#xff09;delete(int start , int end)方法 创建成功的字符串对象&#xff0c;其长度是固定的&#xff0c;内容不能被改变和编译。虽然使用“”可以达到…

Java【二叉搜索树和哈希表】详细图解 / 模拟实现 + 【Map和Set】常用方法介绍

文章目录前言一、二叉搜索树1、什么是二叉搜索树2、模拟实现二叉搜索树2.1, 查找2.2, 插入2.3, 删除3、性能分析二、模型三、哈希表1、什么是哈希表1.1, 什么是哈希冲突1.2, 避免, 解决哈希冲突1.2.1, 避免: 调节负载因子1.2.2, 解决1: 闭散列(了解)1.2.3, 解决2: 开散列/哈希桶…

Uipath Excel 自动化系列18-RefreshPivotTable(刷新透视表)

活动描述 RefreshPivotTable(刷新透视表)&#xff1a;如果透视表的数据源发生变化&#xff0c;需使用刷新透视表活动&#xff0c;该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 使用如下图&#xff1a; RefreshPivotTable(刷新透视表)属性 属性 作用 Display…

最近做到一道好题,特来和大家分享一下。

题目&#xff1a;299. 裁剪序列 - AcWing题库 分析&#xff1a; 题目给我们的数据范围是105;也就是说我们的时间复杂度要控制到O(nlog2n)才可以。假设每一个元素都可以作为一个区间&#xff0c;那么可以有 Cn1……Cnn 2n-1种划分方法&#xff0c;n达到了105,很显然就超时。所以…

MASK-RCNN网络介绍

目录前言一.MASK R-CNN网络1.1.RoIPool和RoIAlign1.2.MASK分支二.损失函数三.Mask分支预测前言 在介绍MASK R-CNN之前&#xff0c;建议先看下FPN网络&#xff0c;Faster-CNN和FCN的介绍&#xff1a;下面附上链接&#xff1a; R-CNN、Fast RCNN和Faster RCNN网络介绍FCN网络介绍…

调试射频TX和rx实验工程出现的问题与反思

1.今天用ADS仿真 发现 加上SMA 插损就到了4db&#xff0c;但是直接用传输线就在1db以内 这个问题我目前想到的排查思路是换成IPEX&#xff0c; 换成IPEX插损就变成2db 拿最新的7626去看 看到上面是SMA-3G 小针 还是结合参考的demo PCB来看 2.用射频的ipex测试LNA 发现校准…

Leetcode. 160相交链表

文章目录指针解法指针解法 核心思路 &#xff1a; 先 分别求两个链表的长度 然后长的链表先走 差距步&#xff08;长-短&#xff09; 最后长链表和短链表同时走 &#xff0c;第一地址相同的就是交点 &#xff0c;注意一定是地址相同 不可能出现上图这种情况 &#xff0c;因为C1…

开放平台订单接口

custom-自定义API操作 ​ ​​注册开通​​ taobao.custom 公共参数 名称 类型 必须 描述 key String 是 调用key&#xff08;必须以GET方式拼接在URL中&#xff09; secret String 是 调用密钥 api_name String 是 API接口名称&#xff08;包括在请求地址中&a…

【JavaSE专栏11】Java的 if 条件语句

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

如何修改Win11上的默认程序?

在Win10之前&#xff0c;更改特定文件格式的默认程序很简单&#xff0c;但在Win11发布之后&#xff0c;很多用户都不清楚关于Win11的修改默认程序的操作步骤&#xff0c;接下来我们就一起来看看吧&#xff0c;希望可以帮助到大家。 步骤如下&#xff1a; 一、如何更改Windows 1…

第十四届蓝桥杯三月真题刷题训练——第 8 天

目录 第 1 题&#xff1a;分数 题目描述 运行限制 代码&#xff1a; 第 2 题&#xff1a;回文日期 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 第 3 题&#xff1a;迷宫 代码&#xff1a; 第 1 题&#xff1a;分数 题目描述 本题为填空题…

自动写代码?别闹了!

大家好&#xff0c;我是良许。 这几天&#xff0c;GitHub 上有个很火的插件在抖音刷屏了——Copilot。 这个神器有啥用呢&#xff1f;简单来讲&#xff0c;它就是一款由人工智能打造的编程辅助工具。 我们来看看它有啥用。 首先就是代码补全功能&#xff0c;你只要给出函数…

C51---蓝牙模块---连接软件---控制LED灯

1.器件&#xff1a;C51、HC-08蓝牙模块、Ty-C数据线、杜邦线 2.软件&#xff1a;HC蓝牙助手 3.接线&#xff1a;VCC-VCC、GND-GND、RXD-TXD、TXD-RXD 4.烧写&#xff1a;STC-ISP串口助手 5.代码&#xff1a; #include "reg52.h" #include "intrins.h" …

方差分析与单因素方差分析

研究分类型自变量对数值型因变量的影响。检验统计的设定和检验方法与变量间的方差是否相等有关。 例如研究行业、服务等级对投诉数的影响&#xff1a;如表格中给出4个行业、每个行业有3个服务等级、样本容量为7、观测值为投诉数。则构成一个3维的矩阵。 在上述基础上&#xf…

iOS中Cell使用的标准附加控件(Swift版本)

Overview 概述 基类UITableViewCell的accessoryType属性可以用来控制"标准附加控件"的类型, 其声明如下: typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) {// 默认值, dont show any accessory viewUITableViewCellAccessoryNone,// regular chevron. …

[深入理解SSD系列 闪存实战2.1.7] NAND FLASH基本编程(写)操作及原理_NAND FLASH Program Operation 源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从N

Keil5 开发 STM32 工程创建

1 创建新工程 打开Keil5软件&#xff0c;点Project菜单的的下来选项New uVision Project…&#xff0c;然后选择工程文件夹放置的目录&#xff0c;新建项目目录&#xff0c;如&#xff1a;LED闪烁 2 选择开发板型号 点击OK后&#xff0c;会弹出配置运行时环境的选项框&…