什么是AOP
AOP(Aspect-Oriented Programming,面向方面编程)是对OOP(Object-Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承和多态等概念来建立对象层次结构,当需要为分散的对象引入公共行为时,OOP就显得无能为力。OOP适合定义从上到下的关系,但不适合定义从左到右的关系。例如日志功能的代码往往水平地分散在所有对象层次中,这种水平分布的代码称为横切(cross-cutting)代码,在OOP设计中会导致大量的代码重复,不利于代码复用和系统维护。
AOP采用“横切”技术,将那些影响了多个类的公共行为封装到一个可重用的模块(Aspect即方面)中。如果对象是一个空心的圆柱体,其中封装的是对象的属性和行为,那么AOP就像一把利刃,将这些空心圆柱体剖开,剖开的切面就是Aspect切面。
AOP把软件分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点经常发生在核心关注点的多处,各处基本相似。比如权限认证、日志、事务处理。AOP的核心思想就是将业务逻辑同对其提供支持的通用服务进行分离。
实现AOP的技术分为两类:一是采用动态代理技术,利用截取消息的方式,对消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建Aspect,从而使编译器可以在编译期间织入Aspect代码。
AOP使用场景
- Authentication权限
- Caching缓存
- Context passing内容传递
- Error handling错误处理
- Lazy loading懒加载
- Debugging调试
- logging,tracing,profiling and monitoring记录,追踪,优化校准
- Performanceoptimization性能优化
- Persistence持久化
- Resource polling资源池
- Synchronization同步
- Transaction事务
AOP中的概念
切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义。在Spring AOP 底层来, Aspect 的概念使用 Advisor 代替, 一个 Advisor 只有一个 Pointcut 和 相应的 Advice。
连接点(Joinpoint):程序执行中明确的点,如方法的调用,或者异常的抛出。
增强处理(Advice):AOP框架在特定的切入点执行增强处理,有Before、After、Around、Throws、Introduction等类型
切入点(Pointcut):可以插入增强处理的连接点,当某个连接点满足指定要求时,该切入点被添加增强处理,该连接点也就变成了切入点
引入(Introduction):将方法或字段添加到被处理的类中,Spring允许将新的接口引入到任何被处理的对象中,例如,可以使用一个引入使任何对象实现IsModified接口,以简化缓存
目标对象(Target Object):包含连接点的对象,也被称为增强的对象,如果AOP采用动态AOP实现,那么该对象就是一个被代理的对象
AOP代理(AOP Proxy):AOP框架创建的对象,代理就是对目标对象的加强。Spring AOP中使用JDK动态代理为实现接口创建代理,cglib为没有实现接口的目标创建代理。
织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种方式:编译时增强(AspectJ)和运行时增强(如Spring AOP)