今日目标

一、AOP

1 AOP简介

问题导入

问题1:AOP的作用是什么?

问题2:连接点和切入点有什么区别,二者谁的范围大?

问题3:请描述什么是切面?

1.1 AOP简介和作用【理解】

1.2 AOP中的核心概念【理解】

image-20210730144903209

 

2 AOP入门案例【重点】

问题导入

问题1:在通知方法中如何定义切入点表达式?

问题2:如何配置切面?

问题3:在配置类上如何开启AOP注解功能?

2.1 AOP入门案例思路分析

2.2 AOP入门案例实现

【第一步】导入aop相关坐标

image-20210730150138448

【第二步】定义dao接口与实现类
【第三步】定义通知类,制作通知方法
【第四步】定义切入点表达式、配置切面(绑定切入点与通知关系)

image-20210730154740528

【第五步】在配置类中进行Spring注解包扫描和开启AOP功能
测试类和运行结果

image-20210730151347354

 

3 AOP工作流程【理解】

问题导入

什么是目标对象?什么是代理对象?

3.1 AOP工作流程

  1. Spring容器启动

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

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

    • 匹配失败,创建原始对象
    • 匹配成功,创建原始对象(目标对象)的代理对象
  4. 获取bean执行方法

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

3.2 AOP核心概念

目标对象(Target):被代理的对象,也叫原始对象,该对象中的方法没有任何功能增强。 代理对象(Proxy):代理后生成的对象,由Spring帮我们创建代理对象。

3.3 在测试类中验证代理对象

image-20210730152631741

 

4 AOP切入点表达式

问题导入

在切入点表达式中如何简化包名和参数类型书写?

4.1 语法格式

4.2 通配符

目的:可以使用通配符描述切入点,快速描述。

匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

image-20210730153824117

4.3 书写技巧

 

5 AOP通知类型【重点】

问题导入

请描述一下如何定义环绕通知方法?

5.1 AOP通知分类

5.2 AOP通知详解

5.2.1 前置通知
5.2.2 后置通知
5.2.3 返回后通知
5.2.4 抛出异常后通知
5.2.5 环绕通知

==环绕通知注意事项==

  1. 环绕通知方法形参必须是ProceedingJoinPoint,表示正在执行的连接点,使用该对象的proceed()方法表示对原始对象方法进行调用,返回值为原始对象方法的返回值。
  2. 环绕通知方法的返回值建议写成Object类型,用于将原始对象方法的返回值进行返回,哪里使用代理对象就返回到哪里。