一、AOP运行流程
1.Spring容器启动
2.读取所有切面配置中的切入点
3.初始化bean,判定bean对应的类中的方法是否匹配到任意切入点
- 匹配失败,创建对象
- 匹配成功,创建原始对象(目标对象)的代理对象
4.获取bean执行方法
- 获取bean,调用方法并执行,完成操作
- 获取的bean是代理对象时,根据对象的运行模式运行原始方法与增强的内容,完成操作
核心概念
- 目标对象:原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
- 代理:目标对象无法直接完成工作,需要对其进行功能回填,通过原始的代理对象实现
SpringAOP本质:代理模式
二、AOP切入点表达式
切入点:要进行增强的方法
切入点表达式:要进行增强的描述方法
描述方法一:执行com.itheima.dao包下的BookDao接口中的无参数update方法
execution(void com.itheima.dao.BookDao.update())
描述方法二:执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法
execution(void com.itheima.dao.impl.BookDaoImpl.update())
切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口.方法名(参数)异常名)
execution(public User com.itheima.service.UserService.findById(int))
- 动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点
- 访问修饰符:public,private等,可以省略
- 返回值
- 包名
- 类/接口名
- 方法名
- 参数
- 异常名:方法定义中抛出指定异常,可以省略
在AOP中可以使用通配符描述切入点,快速描述
- *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
- .. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法
- + :专用于匹配子类类型
三、AOP通知类型
AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置
AOP通知共分为5钟类型
- 前置通知
- 后置通知
- 环绕通知
- 返回后通知
- 抛出异常后通知