第16章-Spring AOP中的基础API

news2025/1/23 4:08:17

文章目录

    • 一、概述
    • 二、切点(Pointcut)
    • 三、通知(Advice)
      • 1. 环绕通知
      • 2. 前置通知
      • 3. 异常通知
      • 4. 后置通知
    • 四、通知者(Advisor)
    • 五、附录
      • 1. 常用接口
      • 2. 示例代码

前面我们讲了基于 XML 和注解两种方式配置 AOP,Spring 还提供了更底层的 API 来定义 AOP。

理解 AOP 通知和切点表达式参阅:

《Spring AOP通知(Advice)详解》

《Spring AOP切点表达式(Pointcut)详解》

一、概述

Spring 项目定义 AOP 功能包含三个部分:切面、切点和通知。

二、切点(Pointcut)

Spring 定义的切点可以复用,可以作用于多个不同的通知。

Pointcut 是核心接口,通过实现它来定义切点。

package org.springframework.aop;

public interface Pointcut {

    ClassFilter getClassFilter();

    MethodMatcher getMethodMatcher();
}

Pointcut 包含两部分,ClassFilter 用于指定目标类,MethodMatcher 匹配目标类中的方法。

import org.springframework.aop.aspectj.AspectJExpressionPointcut;

AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution(* cn.codeartist.spring.*.*(..))");

一般情况下我们不会去自定义切点,而是使用 Spring 提供的实现,例如上面基于 AspectJ 表达式的切点实现。

三、通知(Advice)

Spring 有五种通知类型,只讲下面四种通知类型的 API,通知的执行节点如下。在这里插入图片描述

1. 环绕通知

环绕通知最具功能性,通过实现 MethodInterceptor 接口来定义。

package org.aopalliance.intercept;

@FunctionalInterface
public interface MethodInterceptor extends Interceptor {

	Object invoke(MethodInvocation invocation) throws Throwable;
}

代码示例如下,通过 invocation.proceed(); 方法来调用实际方法或下一个环绕通知。

public class DemoAroundAdvice implements MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // do something before
        Object proceed = invocation.proceed();
        // do something after
        return proceed;
    }
}

环绕通知简单来讲,就是使用拦截器模式来对目标类中的方法进行拦截。

2. 前置通知

前置通知通过实现 MethodBeforeAdvice 来定义。

package org.springframework.aop;

public interface MethodBeforeAdvice extends BeforeAdvice {

	void before(Method method, Object[] args, @Nullable Object target) throws Throwable;
}

代码示例如下:

public class DemoBeforeAdvice implements MethodBeforeAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        // do something before
    }
}

前置通知中,可以获取到目标类,目标类的方法,以及方法的参数。

3. 异常通知

异常通知通过实现 ThrowsAdvice 来定义。

package org.springframework.aop;

public interface ThrowsAdvice extends AfterAdvice {

}

异常通知没有固定的接口方法,可以定义任何符合规范的方法。

// 方法签名模板
void afterThrowing([Method, args, target], ThrowableSubclass);

// 示例方法
public void afterThrowing(Exception ex);
public void afterThrowing(RemoteException);
public void afterThrowing(Method method, Object[] args, Object target, Exception ex);
public void afterThrowing(Method method, Object[] args, Object target, ServletException ex);

方法签名中的前三个参数(方法,参数,目标类)是可选的,第四个参数是异常类型(Throwable 的子类)。

通过第四个参数来匹配异常类型,只有当方法抛出该异常类型时通知才会被执行。

代码示例如下:

public class DemoThrowsAdvice implements ThrowsAdvice {

    public void afterThrowing(Method method, Object[] args, Object target, Exception ex) {
        // do something after throwing
    }
}

4. 后置通知

后置通知通过实现 AfterReturningAdvice 来定义。

package org.springframework.aop;

public interface AfterReturningAdvice extends AfterAdvice {

	void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable;
}

代码示例如下:

public class DemoAfterReturningAdvice implements AfterReturningAdvice {

    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) {
        // do something after returning
    }
}

后置通知可以获取到方法执行成功后的返回值,但不能修改,方法抛出异常时不会执行。

四、通知者(Advisor)

Spring 中的通知者(Advisor)可以定义一个包含切点和通知的切面。

AdvisorPointcutAdvisor 是核心接口,用于定义通知者。

public interface Advisor {

	Advice getAdvice();
}

public interface PointcutAdvisor extends Advisor {

	Pointcut getPointcut();
}

PointcutAdvisor 接口实现需要指定切点和通知。

import org.springframework.aop.support.DefaultPointcutAdvisor;

@Bean
public Advisor demoPointcutAdvisor() {
    DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
    advisor.setPointcut(pointcut);
    advisor.setAdvice(advice);
    return advisor;
}

一般情况下不用自定义通知者,而是用 Spring 提供的实现,例如上面的 DefaultPointcutAdvisor 类。

五、附录

1. 常用接口

接口描述
Pointcut定义切点
MethodInterceptor定义环绕通知
MethodBeforeAdvice定义前置通知
ThrowsAdvice定义异常通知
AfterReturningAdvice定义后置通知
PointcutAdvisor定义通知者(切面)

2. 示例代码

Gitee 仓库:https://gitee.com/code_artist/spring

更多文章关注码匠公众号:CodeArtist。

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

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

相关文章

SpringBoot SpringBoot 原理篇 2 自定义starter 2.3 定时任务报表开发

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.3 定时任务报表开发2.3.1 直接开干2.3.2 小结2 自定义start…

JavaScript函数进阶:闭包

变量作用域 变量根据作用域的不同分为两种:全局变量和局部变量。 1. 函数内部可以使用全局变量。 2. 函数外部不可以使用局部变量。 3. 当函数执行完毕,本作用域内的局部变量会销毁 什么是闭包 闭包(closure)指有权访问另一…

Day13--商品列表-请求并渲染商品列表的数据

1.定义请求参数对象 接口部分: 文档部分: 我的操作: 1》在goods_list.vue中: 1>初步操作: 其效果图: 2>进一步操作: 在goods_list.vue中: 情况①: 情况②&…

python高级在线题目训练-第二套·主观题

1、《Walden》 是美国作家梭罗独居瓦尔登湖畔的记录,描绘了他两年多时间里的所见、所闻和所思。该书崇尚简朴生活,热爱大自然的风光,内容丰厚,意义深远,语言生动。 请用Python统计小说《Walden》 中各单词出现的频次,…

Metabase学习教程:视图-8

漏斗图 使用漏斗图显示步骤的进度。 图1。我们将用示例数据库构建一个漏斗图。 漏斗图用一系列台阶显示了指标。通常,它们用于显示有多少人通过特定的序列(如网站上的结帐流程)完成。第一步是多少人访问你的网站。然后有多少人浏览了一个产品…

【笔记】ABAQUS弹塑性分析

1. 弹塑性分析的主要问题 1.1 elastic-plastic deform behavior abaqus 默认的塑性表现行为是金属材料经典塑性理论,采用mises屈服面定义各向同性屈服。 一般金属材料都是各向同性材料,弹塑性行为: 小应变时,材料表现为线弹性&…

【5G MAC】随机接入流程中的 Msg2 (RAR)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

FL Studio水果2023版本更新下载汉化教程

Image-Line宣布针对Win和Mac版本的数字音频工作站FL Studio的21版本更新。FL Studio2023是一个完整的软件音乐制作环境或数字音频工作站(DAW)。代表超过 23年的创新发展,它包含了您在一个包装中编排,编排,录制&#xf…

cocos creator实现浏览星球的功能,附源码

预览效果: 技术要点: 主摄像机的视场轴需要设置为水平。在场景下创建一个空节点用于挂载控制器脚本图片已进行各概念的说明 在“collisionNodeArray”属性下,放置需要点击的星球节点,系统会自己绑定碰撞器。 也可自己提前绑定。 布…

基于SSM的学籍证明打印系统设计与实现。

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

QT下TCP协议实现数据网络传输

QT开发框架以其跨平台的优势,在全世界IT界如雷贯耳。其封装了功能齐全的各种类,大大的提高了开发者的效率。本篇内容将介绍如何使用QT 6.4.1框架开发服务器和客户端程序,让两端能够首发消息,服务端往客户端发送文件(客…

Spark在Yarn集群的两种提交模式

目录 一.Yarn Client(yarn的客户端模式) 二.Yarn Cluster(yarn的集群节点模式) 三.两者的差异 一.Yarn Client(yarn的客户端模式) 第一步:Driver端会在提交的本地机上运行 第二步:Driver端启动后会跟ResourceManager(RM)进行通信,申请启动一个Applic…

Linux安装Samba服务,基于Fedora

Linux安装Samba服务,基于Fedora1 安装samba服务2 启动samba服务3 更改配置信息4 使用windows系统进行连接5 其他说明1 安装samba服务 1 关闭防火墙及关闭防火墙开机自启 [whs02fedora ~]$ :sudo systemctl stop firewalld.service [whs02fedora ~]$ &a…

splay树:hdu4453 Looploop

题目链接如下: Problem - 4453 主要是要对区间操作和这种splay树的性质比较清楚。 关于区间我们设立两个额外节点,用来设立最开始的左右区间。 性质方面,其实就是二叉搜索树的性质,这里的体现就是中序遍历就是顺时针访问输入数…

《统计学习方法》 第十四章 聚类方法

聚类方法 1.聚类是针对给定的样本,依据它们属性的相似度或距离,将其归并到若干个“类”或“簇”的数据分析问题。一个类是样本的一个子集。直观上,相似的样本聚集在同类,不相似的样本分散在不同类。 2.距离或相似度度量在聚类中…

压力传感器

压力传感器 压力传感器是最常用的一种传感器,其应用范围有各种工业互通环境,涉及航空,航天,军工,石化,电力等。按照不同的测试,压力类型可分表压传感器,差压传感器,绝压…

现代密码学导论-19-基于伪随机函数的CPA安全

目录 3.5.2 基于伪随机函数的CPA安全 基于伪随机函数的加密示意图 CONSTRUCTION 3.28 构造基于伪随机函数的CPA安全的加密方案 THEOREM 3.29 方案3.28是CPA安全的 THEOREM 3.29 的证明 3.5.2 基于伪随机函数的CPA安全 基于伪随机函数的加密示意图 CONSTRUCTION 3.28 构造…

历史中的密码

角色 发送者、接收者和窃听者 当某个人向另一个人发送信息时,发出信息的人称为发送者,而收到信息的人称为接收者,被发送的信息有时也统称为消息( message )。 窃听者 Eve 并不一定是人类,有可能是安装在通信设备上的某…

【JVM】jvm中的方法区简介

jvm中的方法区简介一、JVM体系结构二、方法区是什么?三、方法区能干什么?四、方法区总结一、JVM体系结构 二、方法区是什么? 本文所讲内容在上图中处于运行时数据区内的左侧部分,即 Method Area(方法区)&a…

REHL7.6静默安装Oracle19C

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA工作经验 一位上进心十足的【大数据领域博主】!😜&#x1f61…