1.什么是AOP⾯向切⾯编程
- 什么是AOP
Aspect Oriented Program ⾯向切⾯编程
在不改变原有逻辑上增加额外的功能,⽐如解决系统层⾯的问题,或者增加新的功能 - 场景
权限控制
缓存
⽇志处理
事务控制 - AOP思想把功能分两个部分,分离系统中的各种关注点
核⼼关注点:业务的主要功能
横切关注点:⾮核⼼、额外增加的功能 - 好处
减少代码侵⼊,解耦
可以统⼀处理横切逻辑
⽅便添加和删除横切逻辑
2.AOP⾯向切⾯编程核⼼概念
- 横切、通知、连接点、切⼊点、切⾯
- 横切关注点
对哪些⽅法进⾏拦截,拦截后怎么处理,这些就叫横切关注点
⽐如 权限认证、⽇志、事物 - 通知 Advice
在特定的切⼊点上执⾏的增强处理,有5种通知
⽐如你需要记录⽇志,控制事务 ,提前编写好通⽤的模块,需要的地⽅直接调⽤ - 连接点 JointPoint
要⽤通知的地⽅,业务流程在运⾏过程中需要插⼊切⾯的具体位置,
⼀般是⽅法的调⽤前后,全部⽅法都可以是连接点
只是概念,没啥特殊 - 切⼊点 Pointcut
不能全部⽅法都是连接点,通过特定的规则来筛选连接点, 就是Pointcut,选中那⼏个你想要的⽅法
在程序中主要体现为书写切⼊点表达式(通过通配、正则表达式)过滤出特定的⼀组JointPoint连接点
过滤出相应的 Advice 将要发⽣的joinpoint地⽅ - 切⾯ Aspect
通常是⼀个类,⾥⾯定义 切⼊点+通知 , 定义在什么地⽅; 什么时间点、做什么事情
通知 advice指明了时间和做的事情(前置、后置等)
切⼊点 pointcut 指定在什么地⽅⼲这个事情
web接⼝设计中,web层->⽹关层->服务层->数据层,每⼀层之间也是⼀个切⾯,对象和对象,⽅法和⽅法之间都是⼀个个切⾯ - ⽬标 target
⽬标类,真正的业务逻辑,可以在⽬标类不知情的条件下,增加新的功能到⽬标类的链路上 - 织⼊ Weaving
把切⾯(某个类)应⽤到⽬标函数的过程称为织⼊ - AOP代理
AOP框架创建的对象,代理就是⽬标对象的加强
Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理
3.AOP⾥⾯的通知Advice类型
- @Before前置通知
在执⾏⽬标⽅法之前运⾏ - @After后置通知
在⽬标⽅法运⾏结束之后 - @AfterReturning返回通知
在⽬标⽅法正常返回值后运⾏ - @AfterThrowing异常通知
在⽬标⽅法出现异常后运⾏ - @Around环绕通知
在⽬标⽅法完成前、后做增强处理 ,环绕通知是最重要的通知类型 ,像事务,⽇志等都是环绕通知,注意编程中核⼼是⼀个ProceedingJoinPoint,需要⼿动执⾏ joinPoint.procced()
4.AOP⾯向切⾯编程实例
- 常⻅例⼦
⽤户下单
核⼼关注点:创建订单
横切关注点:记录⽇志、控制事务
⽤户观看付费视频
核⼼关注点:获取播放地址
横切关注点:记录⽇志、权限认证
- 接⼝业务流程例⼦
5. Spring5.X AOP切⼊点表达式
-
切⼊点表示式
除了返回类型、⽅法名和参数外,其它项都是可选的 (修饰符基本都是省略不写)
@Pointcut(“execution(public int net.xdclass.sp.service.VideoOrderService.*(…))”) -
常⻅匹配语法
- *:匹配任何数量字符 单个
- …:匹配任何数量字符,可以多个,在类型模式中匹配任何数量⼦包;在⽅法参数模式中匹配任何数量参数
-
常⻅例⼦
- 任意公共⽅法
- 任何⼀个名字以“save”开始的⽅法
- VideoService接⼝定义的任意⽅法(识别)
- 在service包中定义的任意⽅法(识别)
- 匹配 service 包,⼦孙包下所有类的所有⽅法(识别)
- 任意公共⽅法