简介
面向切面编程Aspect-Oriented Programming(AOP),是将与业务无关,却被业务所共用的逻辑抽取出来,以便于降低模块之间的耦合度。
AOP把系统分为两个部分:核心关注点和横切关注点。业务代码就是核心关注点,而与业务代码不太相关的就是横切关注点。
相关概念
- 切面: 对横切关注点的抽象
- 横切关注点: 对哪些方法进行拦截,拦截后的怎么处理,这些关注点称之为横切关注点。
- 连接点: 被拦截到的方法。
- 切入点: 对连接点进行拦截的定义
- 通知:拦截到连接点之后要执行的代码,分为前置、后置、异常、最终、环绕通知五类。
- 目标对象: 代理的目标对象。
- 织入: 将切面应用到目标对象并导致代理对象创建的过程。
- 引入: 在不修改代码的前提下,引入可以在运行期间为类动态地添加一些方法或字段。
AOP两种代理方式
- JDK动态接口代理
Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。 - Cglib动态代理
可以在运行期扩展Java类与实现Java接口,Cglib封装了asm,可以在运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过Cglib创建动态代理。
应用场景
- Authenticaiotn 权限
- Caching 缓存
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪、优化、校准
- Transaction 事务
- Synchronization 同步
参考
https://segmentfault.com/a/1190000007469968