SpringAOP学习--SpringAOP简介及原理

2023-11-12

前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOP。
Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。
前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理

JDK动态代理回顾

上一篇简单介绍了JDK动态代理如何使用,我们就以此展开SpringAOP原理,和我们自己手写JDK动态代理有何不同!

JDK动态代理使用需要定义一个代理实例的调用拦截处理器InvocationHandler,反射执行目标方法,之前前后可以加入一些额外的代码实现增强。

public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

实现类
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    // before do something;
    Object result = method.invoke(word, args);
    // after do something;
    return result;
}

然后和原对象一起可以生成一个代理对象。

Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, invocationHandler)

然后就可以用代理对象替换原对象,执行原对象操作实现代理切面处理。

这里其实还有些点没有细化:

  1. 如果当前类有三个方法,只需要对其中一个进行切面,那么我们就需要在invoke方法中对方法判断,不是目标方法就不需要增强而是直接反射执行。
  2. 一个类需要进行多次切面,如何有效组织多个切面。

SpringAOP介绍

为了标准化AOP,Spring引入了一套AOP顶级API-- AOP联盟,用来定义和使用AOP。
底层根据配置生成JDK或CGLIB动态代理对象。

AOP联盟

AOP联盟,一群热爱技术的人觉得AOP思想不错,于是打算促进和标准化AOP,定制了一套标准,推动AOP和JAVA发展。
那么AOP联盟的标准是什么呢?
spring-aop jar包中有个目录org.aopalliance,其中存在几个接口,即是AOP联盟提供的AOP标准API。
在这里插入图片描述
在这里插入图片描述

SpringAOP核心概念

上述中已经出现的关键词有Advice(顶级的通知类/拦截器)、MethodInvocation(方法连接点)、MethodInterceptor(方法拦截器)
SpringAOP在此基础上又增加了几个类,丰富了AOP定义及使用概念,包括

Advisor:包含通知(拦截器),Spring内部使用的AOP顶级接口,还需要包含一个aop适用判断的过滤器,考虑到通用性,过滤规则由其子接口定义,例如IntroductionAdvisor和PointcutAdvisor,过滤器用于判断bean是否需要被代理

Pointcut: 切点,属于过滤器的一种实现,匹配过滤哪些类哪些方法需要被切面处理,包含一个ClassFilter和一个MethodMatcher,使用PointcutAdvisor定义时需要

ClassFilter:限制切入点或引入点与给定目标类集的匹配的筛选器,属于过滤器的一种实现。过滤筛选合适的类,有些类不需要被处理

MethodMatcher:方法匹配器,定义方法匹配规则,属于过滤器的一种实现,哪些方法需要使用AOP

SpringAOP实现的大致思路:
1.配置获取Advisor (顾问):拦截器+AOP匹配过滤器,生成Advisor
2.生成代理:根据Advisor生成代理对象,会生成JdkDynamicAopProxy或CglibAopProxy
3.执行代理:代理类执行代理时,从Advisor取出拦截器,生成MethodInvocation(连接点)并执行代理过程

SpringAOP与AOP联盟关系

请添加图片描述

配置Advisor

这一步对SpringAOP使用者很关键,决定了我们如何定义配置Advisor,即SpringAOP和Aspectj,实际使用配置AOP方式有多种,还区分xml和注解,最终转化处理时我认为只分为这两种。其中Aspectj方式配置AOP应该是最常见应用最广泛的用法了

前面提到Aspectj是一种静态代理,而SpringAOP是动态代理。但Aspectj的一套定义AOP的API非常好,直观易用。所以Spring引入了Aspectj,但只使用部分注解用来定义配置AOP,在获取Advisor阶段用来生成Advisor,与后面的代理生成和代理增强执行无关!

这两种方式有什么不同呢?

1.直接配置Advisor
实现Advisor接口,定义拦截器和拦截规则(切点)
2.间接配置Advisor
使用Aspectj jar包提供的注解定义AOP配置,由Spring解析配置生成Advisor

下面以一个DEMO看看分别如何配置,为了方便展示,直接使用SpringBoot项目配置,暂时忽略复杂的细节只关注核心配置。
示例全部采用注解方式,不使用XML配置方式

在这里插入图片描述

直接配置Advisor

最少需要定义三个类,一个Advisor的实现类,一个Advice实现类(拦截器),一个aop适配过滤器(这里使用的Advisor为派生的PointcutAdvisor ,需要定义PointCut切点)。可以增加一个注解用于AOP埋点,需要给bean哪个方法进行切面,则方法上加上该注解。
Advisor:MyAdvisor,返回一个Advice,
Advice:MyInterceptAdvice,拦截器,invoke方法中可以添加切面逻辑代码
PointCut: MyPointCut,切点,匹配过滤出需要切面的类及方法,查找方法头注解了MyAnnotation的方法。
埋点注解:MyAnnotation

MyAdvisor.java

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringAOP学习--SpringAOP简介及原理 的相关文章

  • 对如何在 Android 上使用 CouchDB 感到困惑

    我想让 CouchDB 作为我的移动应用程序的后端运行 取代 SQlite 作为这项技术的新手 我一直感到非常困惑 因为除了去年 Couchbase 发布的所有听起来类似的产品 Couchbase Couchbase Single Serv
  • Android Volley 对于一个请求返回两次结果

    我两天来一直在试图解决这个问题 但我完全被难住了 由于某种原因 我向队列发送一个请求 但 volley 返回两次 这会调用侦听器两次并使列表视图中的结果加倍 我打开了 Volley 的日志记录 可以看到请求被添加到队列中并返回 然后几秒钟后
  • 使用街景图像

    我想获取街景图片 注明纬度和经度 并显示在对话框中 这可能吗 我在这里看到了一些示例 但没有找到一个向我展示如何在对话框中显示图像的示例 抱歉 如果网站中已经存在这个问题 但我在搜索时没有找到 是的你可以 作为 URL 根 你可以使用这个h
  • 调整 Android 日期选择器控件的大小

    如何将 android datepicker 控件的初始大小调整为更小或更大 有没有唯一的方法可以重新实现它 我一直无法找到调整其大小的方法 但已经看到了使用 DatePicker 作为对话框的实现 日期呈现为带有编辑按钮的 TextVie
  • Cordova 无法构建项目

    Update 新读者 请检查我最后的编辑 更新cordova后 无法构建 运行 Mac mini de Toni funcook toniweb sudo cordova build Password Running command Use
  • 运行低于 Lollipop 的设备上的 CameraManager

    我遇到一个问题 我同时使用 Camera 低于 Lollipop 设备 和 CameraManager 类 Lollipop 及以上设备 运行低于 Lollipop 的设备会崩溃 我相信这是因为 import android hardwar
  • 如何避免 Android 游戏中的时钟漏洞?

    我需要测量一段可以持续几个小时的时间 我假设执行此操作的正常方法是这样的 Date date new Date wait some time new Date getTime date getTime 但是用户是否可以将 Android 的
  • 如何让按钮的角变圆?

    我想制作一个角button圆形的 在 Android 中是否有一种简单的方法可以实现这一点 如果你想要这样的东西 这是代码 1 在您的可绘制文件夹中创建一个 xml 文件 如 mybutton xml 并粘贴以下标记
  • Gradle 构建失败 - 无法解压

    我正在使用 android studio 做一个项目 最近它显示了一个错误your SDK is missing or out of date所以 我再次下载了SDK 现在它显示一个错误 Gradle Build failed 错误如下 E
  • 在Android上使用XStream时如何注释order字段?

    我需要从 Android 上的 java 对象生成 XML XML 节点必须位于 确定的顺序 这是我得到的 这些字段按字母顺序排列
  • @android的含义

    我想问一下是什么意思 android as in android id android id list 我在不同的 android 示例和教程中看到过它 我也用谷歌搜索过它 我发现的唯一解释是 列表和空 ID 是由 Android 平台为我
  • SpannableString 中的 URLSpan

    我正在使用这个例子SpannableString http developer android com resources samples ApiDemos src com example android apis text Link ht
  • Android 中 Admob 的 XML 或 Java 关键字

    我似乎找不到任何有关通过 XML 或 Java 设置 adMob 广告关键字的可靠文档 我已经尝试过中看到的方法this https stackoverflow com questions 5066129 android admob api
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 如何在两种不同模式、两种布局中设置方向?

    我有一个叫做Main XML我将方向设置为纵向AndroidManifest xml 我也为 Honeycomb 设计了这个布局并将其放置在layout xlarge mdpi文件夹 但我想使用Main XML in layout xlar
  • 找不到满足版本限制的“com.google.code.findbugs:jsr305”版本

    当生成签名的 APK 进行发布时 我收到此错误消息 Cannot find a version of com google code findbugs jsr305 that satisfies the version constraint
  • 是否可以从外部闪存驱动器运行 java (jdk-windows)、Eclipse (indigo) 和 Android-sdk 进行 Android 应用程序开发

    我想知道我们是否可以通过在外部闪存驱动器上保存所需的软件来在我们使用的任何计算机上开发我们的android应用程序 我的意思是在闪存驱动器上安装java eclipse和android sdk 所以最后我们可以将闪存带到任何地方计算机并在任
  • 如何在 Android 中通过 gradle 列出 buildConfig 中的所有类型

    这是一个简单的 gradle 具有三种风格 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 default

随机推荐

  • 如何免费使用ChatGPT

    前段时间想使用一下CahtGPT产品说明文档 找了一大圈国内基本都收费或者需要开通会员的 需要使用所谓的算力 其实相对于所谓的算力和会员也可以理解 做一款产品是需要营利的 只是这个费用太贵了 可以对比一下官方报价 国外 国内 ChatGPT
  • 高级软件工程课程总结

    1 初识软件工程 1 1软件无处不在 软件定义世界 成为社会发展的潮流 软件在人类生活中扮演者越来越重要的角色 软件已经成为一个极其重要的产业形态 软件是软件工程的研究对象 也是软件工程的产品形态与客观存在 工程是将理论和知识应用于实践的科
  • PS制作表情包

    表情包制作 素材 效果图
  • Elastic学习:ES安装以及head插件安装

    这里首先先安装ELK三剑客 ElasticSearch LogStash Kibana 里面的ElasticSearch在widnows上的安装 如果官网下载慢或打不开的的话 可以尝试搜一下国内的镜像或者网盘什么的 1 下载解压安装包 2
  • python整数类型bcdoxx_appium+python搭建自动化测试框架_Tools安装(一) - 为你开出一树春天 - 博客园...

    appium python搭建自动化测试框架 Tools安装 一 作者的配置环境和版本 win10 python3 6 Appium v1 4 16 1 下载node https nodejs org en download 下载node
  • 【GIT】git 错误记录

    目录 error Your local changes to the following files would be overwritten by merge xxx git error the following untracked w
  • php是一种基于,一种基于Java技术的PHP编译器的设计与开发

    收稿日期 2003 06 03 作者简介 朱 1976 男 江苏南京人 江苏广播电视大学现代教育技术中心助理工程师 一种基于Java 技术的 PHP 编译器的设计与开发 朱 江苏广播电视大学 江苏 南京 210036 摘 要 为提高 PHP
  • 幸亏四年前,离职了

    从一个前同事了解 以前的组长去年10月份也跳槽了 在该公司时 只让我做界面和业务逻辑 以及GDAL 那时候就想 如果五年合同满了 就得指望组长吃饭了 没竞争力了 现在想想 如果不走 组长走了 只懂皮毛的我 该怎么混呢 看来谁也指望不上 就得
  • <a_range-picker>组件选择时间段的使用

    仅供学习 不可转载 研究了好长时间终于把选择时间段存到数据库和从数据库里面拿出来做到回显给弄明白了 在这里做一个非常详细的笔记 从前端的vue到后端整个的实现过程 效果图 思路 1 gt 首先这个组件的使用比较简单 直接拿过来用就可以了
  • 状态机修改C++风格注释为C风格注释

    include
  • 正大期货新闻:印度调高了棕榈油以及豆油的进口基础价格

    外媒2月15日消息 周二印度政府发布的声明称 印度调高了棕榈油和豆油的进口基础价格 因为海外价格大幅上涨 毛棕榈油的进口基础价格从1346美元 吨调高到1359美元 吨 33度精炼棕榈油从1368美元调高到1376美元 24度精炼这样从13
  • 5.44 综合案例2.0-矩阵键盘信息输入上传-OLED屏幕

    综合案例2 0 矩阵键盘信息输入上传 OLED屏幕 案例说明 1 应用场景 2 M320矩阵引脚说明 3 接线说明 搭建云平台环境 1 添加设备 2 创建设备类型 3 功能定义 创建物模型 代码 1 更改MQTT信息 测试 案例说明 矩阵键
  • 金九银十如何抱佛脚?2023最新大厂 Java 面试真题合集(附完整答案解析)

    2023 秋招眼看着就要来了 但是离谱的是 很多同学最近才想起来还有秋招这回事 所以纷纷临时抱佛脚 问我有没有什么快速磨枪的方法 我的回答是 有 说起来 临阵磨枪没有比背八股文更靠谱的了 很多人对这个很不屑 呵 背题家罢了 但国内大环境如此
  • QT项目超详细打包教程

    一 将QT项目调成为release模式并运行程序 二 在QT中点击项目 三 复制项目的构建目录 四 进入项目的构建目录 找到release文件并进入 五 在release文件夹下新建一个文件夹 任意起名 六 将release文件夹下生成的可
  • Golang 切片删除指定元素的几种方法

    文章目录 1 截取法 修改原切片 2 拷贝法 不改原切片 3 移位法 修改原切片 3 1 方式一 3 2 方式二 4 性能对比 5 小结 参考文献 Go 并没有提供删除切片元素专用的语法或函数 需要使用切片本身的特性来删除元素 删除切片指定
  • C++中两个栈实现一个队列

    引言 首先看这个标题的时候 需要联想到栈和队列的特点 栈是先进后出 队列是先进先出 假如三个元素1 2 3 将这三个元素依次入栈1后 再将栈1中元素依次出栈放入到栈2中 栈1中只留下最后一个元素1 此时栈2中由两个元素 接下来获取栈1中的栈
  • QT-子线程访问主界面UI控件的有效方法

    引言 当软件需要导入大量数据文本时 若显示控件操作放在主界面UI线程中 会导致在导入数据的过程中存在界面卡死的现象 这种现象在工业控制工况中中是致命的 因此本文章旨在实现非UI子线程对UI主线程的操作 这里举一个简单的Demo 大文本数据通
  • 三款很酷很骚气的底部导航

    早上好 骚年 我是小菜 我的公众号 菜鸟翻身 会推荐 GitHub 上好玩的项目 一分钟 get 一个优秀的开源项目 挖掘开源的价值 欢迎关注我 底部导航栏是 APP 最常用的功能之一 想最初都是自己自定义 ViewGroup 实现 后来
  • PMBOK(第六版) PMP笔记——《第六章 项目进度管理》

    第 6 6 章 项目进度管理 项目进度管理包括为管理项目按时完成所需的各个过程 项目进度计划 Schedule 说明了项目如何以及何时交付项目范围中定义的产品 服务 和成果 创建 WBS 最底层得到的是工作包 但是为了更好的估算活动持续时间
  • SpringAOP学习--SpringAOP简介及原理

    前文对AOP做了介绍 实际项目中 一般不会直接上手手动实现aop 而是使用一些高级封装的aop实现 如SpringAOP Spring是一个广泛应用的框架 SpringAOP则是Spring提供的一个标准易用的aop框架 依托Spring的