AOP(Aspect-OrientedProgramming,面向方面编程), 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。实现场景日志记录,性能统计,安全控制,事务处理,异常处理等等。
AOP与OOP的区别
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
简化说明:
- OOP是面向对象的,AOP是面向切面的。
- 思想结构不同:OOP是纵向的,AOP是横向的。
- 侧重点不同:OOP注重业务逻辑单元的划分,AOP偏重业务处理过程的某个步骤或阶段。
实现AOP的技术:
采用动态代理:利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
采用静态织入的方式:引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
AOP相关概念:
从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 作案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程, 但是由于天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵当然不敢违背县令的命令, 只好把进出城的所有符合条件的人都抓了起来.
切面(Aspect):Aspect
是Pointcut 与 Advice
的组合,类比:“根据老王的线索, 凡是发现有身高七尺五寸的男性, 都要抓过来审问” 这一整个动作可以被认为是一个 Aspect
.连接点(Joinpoint):爪哇的小县城里的百姓
切入点(Pointcut): 男性, 身高约七尺五寸(其实也就是定义嫌疑犯的特征)
通知(Advice):抓过来审问。这是一个动作。
通知的类型:
@Before("pointCut_()") 前置通知: 目标方法之前执行
@After("pointCut_()") 后置通知:目标方法之后执行(始终执行)
@AfterReturning("pointCut_()") 返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing("pointCut_()") 异常通知: 出现异常时候执行
@Around("pointCut_()") 环绕通知: 环绕目标方法执行