1、AOP 概述

  AOP (Aspect-Oriented  Programming,面向切面编程):是一种新的方法论,是对传统 OOP (Object-Oriented  Programming,面向对象编程)的补充。

  AOP 就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

  作用:在程序运行期间,不修改源码对已有方法进行增强。

  优势:减少重复代码、提高开发效率、维护方便。

  实现方式:使用动态代理技术。

  涉及 AOP 的专业术语:

  

2、AOP 的使用步骤

  【1】导包:6基础包+1切面基础包+3切面加强包

    spring-beans-4.0.0.RELEASE

    spring-context-4.0.0.RELEASE

    spring-core-4.0.0.RELEASE                                    com.springsource.net.sf.cglib-2.2.0

    spring-expression-4.0.0.RELEASE    +    spring-aspects-4.0.0.RELEASE    +      com.springsource.org.aopalliance-1.0.0   

    spring-aop-4.0.0.RELEASE                                  com.springsource.org.aspectj.weaver-1.6.8.RELEASE

    commons-logging-1.1.3

  【2】写配置

    1. 将目标类和切面类(封装了通知方法(在目标方法执行前后执行的方法))加入到ioc容器中。

      目标类:

      

      切面类

      

    2. 告诉Spring到底哪个是切面类 @Aspect

      切面类

      

    3. 告诉 Spring,切面类里面的每一个方法,都是何时何地运行;

      

    4. 开启基于注解的 AOP 模式

     

3、细节

  【1】IOC 容器中保存的是组件的代理对象

    从 IOC 容器中拿到目标对象;注意:如果想要用类型,一定用他的接口类型,不要用它本类。

    AOP的底层就是动态代理,容器中保存的组件是他的代理对象;$Proxy12。当然不是本类的类型

    

    如果目标类没有接口怎么办?

      没有接口就是本类类型,可以通过本类类型拿,也可以通过本类 id 拿,id 值为类名首字母小写。

    

  【2】切入点表达式的写法

    固定格式:execution(访问权限符 返回值类型 方法全类名(参数表))

    通配符:两种

      * :

       1. 匹配一个或者多个字符

       2. 匹配任意一个参数

       3. 只能匹配一层路径

       4. 权限位置 * 不能;权限位置不写就行;public【可选的】

      .. :

       1. 匹配任意多个参数,任意类型参数

       2. 匹配任意多层路径

    通配符总结:

      1. 最精确的:execution(public int com.atguigu.impl.CalculatorImpl.add(int,int))

      2. 最模糊的:execution(* *.*(..)),千万别这样写(见方法就切)

      3. 通用写法:execution(*  com.atguigu.impl.*.*(..))

  【3】通知方法的执行顺序:两种

    

    正常情况:@Before(前置通知)===== @After(后置通知)==== @AfterReturning(正常返回);

    异常情况:@Before(前置通知)===== @After(后置通知)==== @AfterThrowing(方法异常);

  【4】JoinPoint 获取目标方法的信息

    1、只需要为通知方法的参数列表上写一个参数 JointPoint  jointPoint,这个参数封装了当前目标方法的详细信息。

    2、方法正常执行完成,如何获取返回值。returning="result";告诉 Spring 这个 result 用来接收返回值。

    

      3、方法执行处问题了,如何接异常信息?throwing="exception":告诉 Spring 哪个参数是用来接收异常。

    

  【5】Spring 对通知方法的约束

    1. Spring对通知方法的要求不严格,有无返回值,返回值类型不限制。

    2. 唯一要求的就是方法的参数列表一定不能乱写?因为通知方法是 Spring 利用反射调用的,每次方法调用得确定这个方法的参数表的值。

  【6】切入点表达式的重用

    1. 先声明一个没有实现的返回void的空方法。

    2. 给方法上标注 @Pintcut 注解。

    

  【7】环绕通知

    环绕通知是 Spring 最强大的通知,四合一通知。

    

  【8】环绕通知执行顺序

    环绕通知优先于普通通知执行

    环绕前置===普通前置===目标方法执行===环绕返回/环绕异常===环绕后置===普通后置===普通返回/普通异常。

    细节:有异常环绕一定要把异常抛出去,这样才能被普通异常捕获,否则环绕有异常,环绕吃掉异常,普通正常返回,但没有返回值。

  【9】多切面运行顺序

    1. 不加环绕通知:

      1. 先进后出,谁里谁外看字幕顺序。

      2. 使用 @Order 注解,值小的先执行。

    

    

    2. 加环绕

      看环绕在那个切面类。环绕只是影响当前切面。

4、AOP 使用场景

  【1】AOP 加日志保存到数据库

  【2】AOP 做权限验证

  【3】AOP 做安全检查

  【4】AOP 做事务控制

5、基于 xml 配置的 AOP 写法

  【1】回顾基于注解的AOP

    1. 将目标类和切面类交给 Spring 管理,@Component、@Service

    2. 告诉 Spring 哪个是切面类,@Aspect

    3. 告诉 Spring 通知方法何时何地运行

    4. 开启注解

  【2】xml 写法

    1. 将目标类和切面类交给 Spring 管理

    

    2、3. 告诉 Spring 哪个是切面类,通知方法何时何地运行。

    

    细节:

      1. 切入点表达式可以写在通知方法内、切面类内方法外、切面类外。

      

  【注解和 xml 配置写法比较】

    1. 注解:快速方便

    2. xml 配置:功能完善,重要的用配置。

Spring 笔记三 AOP的更多相关文章

  1. Spring笔记(三)AOP前篇之动态代理

    AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合.比较强调程序的层次结构,是一种面向切面的编程.而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态 ...

  2. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

  3. Spring in Action 学习笔记三-AOP

    面向切面的Spring 2015年10月9日 11:30             屏幕剪辑的捕获时间: 2015-10-9 14:30             屏幕剪辑的捕获时间: 2015-10-9 ...

  4. Spring笔记三

    Spring-03 1. AOP 1.1 概念 ​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...

  5. spring笔记(三)

    Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的“事务控制”, 可以用aop实现! 即只需要写一次,运行时候动 ...

  6. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  7. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  8. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  9. Spring(三)面向切面编程(AOP)

    在直系学长曾经的指导下,参考了直系学长的博客(https://www.cnblogs.com/WellHold/p/6655769.html)学习Spring的另一个核心概念--面向切片编程,即AOP ...

  10. Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

    1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法   2.作用:本质上来说是一种简化代码的方式      继承机制      封装方法      动 ...

随机推荐

  1. 蓝桥杯训练赛二-问题 A

    题目描述 用简单素数筛选法求N以内的素数. 输入 N 输出 2-N的素数 样例输入 100 样例输出 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 ...

  2. form 表单中input 使用disable属性

    记录一下今天踩得坑. 在使用form表单提交的时候,input用了disable属性,在查找了好久之后,找到原因,万万没想到是因为disable. 修改方法:disable改为readonly dis ...

  3. webp图像格式

    WebP图像格式 这是支持在互联网上无损和有损图像质量压缩的新格式. 谷歌公司开发这种格式专为在网上迅速和方便地做好工作. 其主要优点是,相对于其他图像格式,文件小,但图像质量相似. 打开: WIND ...

  4. java技术系列(二) 反射

    能够分析类能力的程序称为反射. 反射能力: 在运行中分析类的能力. 在运行中查看对象,例如:编写一个toString方法供所有类使用. 实现通用的数组操作代码. 利用Method对象.

  5. vite vue插件打包配置

    import { defineConfig, UserConfigExport, ConfigEnv } from "vite"; import externalGlobals f ...

  6. PyMySQL插入

    title: PyMySQL插入 author: 杨晓东 permalink: PyMySQL插入 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...

  7. Kubernetes之Pod详解

    1.Pod生命周期 pod创建 1. API Server 在接收到创建pod的请求之后,会根据用户提交的参数值来创建一个运行时的pod对象. 2. 根据 API Server 请求的上下文的元数据来 ...

  8. 洛谷 P4454 [CQOI2018]破解D-H协议

    题目 https://www.luogu.com.cn/problem/P4454 杂题乱做ing... 思路 首先我们把式子列一下: \(g^a\equiv A(mod P)\) \(g^b\equ ...

  9. 模块一:时间模块、random模块、hashlib模块、日志模块

    模块:就是一系列功能的集合体,有以下分类:*解释器内建模块*python标准库(位于python解释器安装目录的lib文件夹下)*第三方模块(通过(pip install 模块名)语法下载到pytho ...

  10. Mac如何用鼠标快速锁屏

    锁屏谁不会啊?本来写这篇文章,感觉自己太多余,但用鼠标直接锁屏就有点小意思,Mac对于很多人来说非常模式,通常是商务.设计这类人事在使用,对于新手而言,它的功能过于隐藏,那么Mac要如何达到快速锁屏呢 ...