AOP(Aspect Oriented Programming)简介

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

  

AOP核心概念

  

  • 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等

    • 在SpringAOP中,理解为方法的执行
  • 切入点(Pointcut):匹配连接点的式子
    • 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

      • 一个具体方法:com.cqupt.dao包下的BookDao接口中的无形参无返回值的save方法
      • 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
  • 通知(Advice):在切入点处执行的操作,也就是共性功能
    • 功能最终以方法的形式呈现
  • 通知类:定义通知的类
  • 切面(Aspect):描述通知与切入点的对应关系

AOP入门案例

  

  

  

  

  

  

  

AOP 工作流程

  1、Spring容器启动

  2、读取所有切面配置中的切入点

  3、初始化bean,判定bean对应的类中的方法是否匹配到任意切入点

    *匹配失败,创建对象

    *匹配成功,创建原始对象(目标对象)的代理对象

  4、获取bean执行方法

    *获取bean,调用方法并执行,完成操作

    *获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强内容,完成操作

AOP 核心概念

  • 目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象时无法直接完成最终工作的
  • 代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现

AOP 切入点表达式

  • 切入点:要增强的方法
  • 切入点表达式:要进行增强的方法的描述方式

  

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

  

  • 可以使用通配符描述切入点,快速描述

  

  

AOP 通知类型

  • 描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时,要将其加入到合理的位置
  • AOP通知分5中类型
    • 前置通知
    • 后置通知
    • 环绕通知(重点)
    • 返回后通知(了解)
    • 抛出异常后通知(了解)

  

  

  

  

  

  

AOP 小案例--万次执行效率

  

  • 需要用到获取包名、方法名等来知晓具体那个方法执行的时间

  

AOP 通知获取数据

  • 获取切入点方法的参数

    • JoinPoint:适用于前置、后置、返回后、抛出异常后通知
    • ProceedJoinPoint:适用于环绕通知
  • 获取切入点方法返回值
    • 返回后通知
    • 环绕通知
  • 获取切入点方法运行异常信息
    • 抛出异常后通知
    • 环绕通知

  

  

AOP 小案例--去除密码末尾的空格

  

Spring —— AOP(面向切面编程)的更多相关文章

  1. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  2. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  3. spring AOP面向切面编程学习笔记

    一.面向切面编程简介: 在调用某些类的方法时,要在方法执行前或后进行预处理或后处理:预处理或后处理的操作被封装在另一个类中.如图中,UserService类在执行addUser()或updateUse ...

  4. 【Spring系列】Spring AOP面向切面编程

    前言 接上一篇文章,在上午中使用了切面做防重复控制,本文着重介绍切面AOP. 在开发中,有一些功能行为是通用的,比如.日志管理.安全和事务,它们有一个共同点就是分布于应用中的多处,这种功能被称为横切关 ...

  5. 从源码入手,一文带你读懂Spring AOP面向切面编程

    之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...

  6. Spring AOP面向切面编程详解

    前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...

  7. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  8. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...

  9. 详细解读 Spring AOP 面向切面编程(一)

    又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...

  10. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

随机推荐

  1. oeasy教您玩转vim - 90 - # 语法定义syntax

    ​ 内容查找 grep 回忆 我们这次研究了一下配色方案 murphy虽然配色好看 但是对于java的支持并不好 我们对于murphy进行了修改 增加了String.StorageClass颜色的定义 ...

  2. VBA:用代码操作代码

    Sub auto_open() Call runtimer '打开文档时自动运行 End Sub Sub runtimer() Application.OnTime Now + TimeValue(& ...

  3. ceph 002 ceph架构 ceph数据存储过程 ceph集群安装

    ceph 架构 rgw:实现对象存储 (web的url和swift,s3接口) mon:集群的访问入口 (集群,同时工作,得同步信息.每个mon的ip不一样) mgr:监控 信息收集 web 界面 ( ...

  4. 如何在anaconda环境中安装cuda.h和cuda_runtime.h

    在前面的文章(几年前的文章)中我们介绍了在anaconda中安装cuda.cudnn后,有介绍了如何在anaconda中安装nvcc.nccl等NVIDIA的各种编译器和库,本文介绍如何在anacon ...

  5. 强化学习中经典算法 —— reinforce算法 —— (进一步理解, 理论推导出的计算模型和实际应用中的计算模型的区别)

    在奖励折扣率为1的情况下,既没有折扣的情况下,reinforce算法理论上可以写为: 但是在有折扣的情况下,reinforce算法理论上可以写为: 以上均为理论模型. ================ ...

  6. 华为超算平台git、cmake、wget、curl报错:SSLv3_client_method version OPENSSL_1_1_0 not defined in file libssl.so.1.1 with link time reference——解决方法

    最近在使用超算平台时报错,不管是git.cmake.wget.curl中的哪个都报错,大致错误: /usr/bin/cmake3: relocation error: /usr/lib64/libcu ...

  7. 再探GraphRAG:如何提升LLM总结能力?

    作者:王振亚 编者语: 自微软发布GraphRAG之后,相关解读文层出不穷,其中不乏优秀的内容.比如前段时间转载薛明同学的<微软GraphRAG框架源码解读>让大家快速对GraphRAG的 ...

  8. 代码随想录Day10

    232.用栈实现队列 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void push(int x) 将 ...

  9. 修改ListCtrl控件列标题文本居左显示

    修改ListCtrl控件标题文本居左显示 原来的列标题文本是居中显示: 现在要把列表文本居中改为居左显示 其方法如下: 获得标题控件句柄 g_listCtrl.m_hWnd为ListCtrl控件的句柄 ...

  10. Python 潮流周刊#66:Python 的预处理器(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...