什么是AOP
- Aspect Oriented Program ⾯向切⾯编程
在不改变原有逻辑上增加额外的功能,⽐如解决系统层⾯的问题,或者增加新的功能
例如,在一个地方买商品,买的核心业务逻辑,需要做权限校验(是否是用户,是否登录),我们一般是在拦截器去做,拦截器也是AOP思想的体现,所以就可以在下单之前做一个权限控制而不是在service层去做。
- 场景
- 权限控制
- 缓存
- 日志处理
- 事务控制
- AOP思想把功能分两个部分,分离系统中的各种关注点
- 核⼼关注点
- 业务的主要功能
- 例如下单
- 业务的主要功能
- 横切关注点
- ⾮核⼼、额外增加的功能
- 例如下单前的权限校验、日志等
- ⾮核⼼、额外增加的功能
- 好处
- 减少代码侵入,解耦
- 可以统⼀处理横切逻辑
- ⽅便添加和删除横切逻辑
AOP面向切面编程的核心概念
- 横切、通知、连接点、切⼊点、切⾯
- 横切关注点
对哪些⽅法进⾏拦截,拦截后怎么处理,这些就叫横切关注点,比如 权限认证、⽇志、事物
- 通知 Advice
在特定的切⼊点上执⾏的增强处理,有5种通知。⽐如你需要记录⽇志,控制事务 ,提前编写好通⽤的模块,需要的地⽅直接调⽤
- 连接点 JointPoint
要⽤通知的地⽅,业务流程在运⾏过程中需要插⼊切⾯的具体位置,⼀般是⽅法的调⽤前后,全部⽅法都可以是连接点,只是概念,没啥特殊
- 切⼊点 Pointcut
不能全部⽅法都是连接点,通过特定的规则来筛选连接点,就是Pointcut,选中那⼏个你想要的⽅法。在程序中主要体现为书写切⼊点表达式(通过通配、正则表达式)过滤出特定的⼀组JointPoint连接点。过滤出相应的 Advice 将要发⽣的joinpoint地⽅
- 切⾯ Aspect
通常是⼀个类,⾥⾯定义 切⼊点+通知,定义在什么地⽅、什么时间点、做什么事情,通知advice指明了时间和做的事情(前置、后置等),切⼊点pointcut指定在什么地⽅⼲这个事情,web接⼝设计中,web层->⽹关层->服务层->数据层,每⼀层之间也是⼀个切⾯,对象和对象,⽅法和⽅法之间都是⼀个切⾯
- ⽬标 target
⽬标类,真正的业务逻辑,可以在⽬标类不知情的条件下,增加新的功能到⽬标类的链路上
- 织⼊ Weaving
把切⾯(某个类)应⽤到⽬标函数的过程称为织⼊
- AOP代理
AOP框架创建的对象,代理就是⽬标对象的加强,Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理