一、什么是Aop
OOP(Object Oriented Programming)面向对象编程。
AOP(Aspect Oriented Programming)面向切面编程。
OOP模块化的关键单元是类,AOP模块化的关键单元是切面。AOP是对OOP的补充。
Spring AOP是这种AOP思想的技术实现,它是Spring框架的一个重要组成部分。
Spring IOC容器并不依赖Aop,Aop做为Spring IOC容器的一个补充,使它成为一个强大的中间件解决方案。
在Spring框架中,AOP用于:
- 提供声明式企业服务,最重要服务是声明式事务管理。
- 允许用户实现自定义切面,用AOP来完善OOP的使用。
AOP采用"横切"的技术,剖解开封装的对象内部,将影响了多个类的公共行为封装到一个可重用模块。如:日志模块、权限模块、事务模块。
简单地说,动态地将代码切入到类的指定方法、指定位置上的编程思想就是AOP。
二、Aop相关术语
-
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象,是通知和切点的结合。如:事务管理、日志管理、权限管理都是一个切面。
-
连接点(join point):在程序执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,一个连接点总是表示一个方法的调用。
-
通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
Spring切面可以应用5种类型的通知:
前置通知(Before):在目标方法被调用之前调用通知功能。
后置通知(After):在目标方法完成之后调用通知,不关心方法的输出是什么。是“返回通知”和“异常通知”的并集。
返回通知(After-returning):在目标方法成功执行之后调用通知。
异常通知(After-throwing):在目标方法抛出异常后调用通知。
环绕通知(Around):通知包裹了被通知的方法,可同时定义前置通知和后置通知。 -
切点(PointCut): 可以插入增强处理的连接点。切点定义了在何处工作,也就是在哪个方法应用通知。
-
引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
-
织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
编译器:切面在目标类编译时被织入。这种方式需要特殊的编译器。
类加载期:切面在目标类被引入应用之前增强该目标类的字节码。
运行期:切面在应用运行的某个时刻被织入。 -
目标对象(Target object):被一个或多个切面所通知的对象。也被称作被通知(advised)对象,该对象始终是代理对象。
-
AOP代理(AOP proxy):由AOP框架创建的一个对象,用于实现切面契约(例如通知方法执行等),在Spring框架中,AOP代理可以是JDK动态代理或CGLIB代理。
三、Aop的优点
- 使得每个关注点都集中于一个地方而不是分散在多处代码中,便于后期的统一维护管理。
- 服务模块更简洁,它们只包含主要关注点,而次要关注点的代码被转移到切面中了。
- 对原方法进行方法增强,且不影响原方法的正常使用。
- 配置可插拔,可在实际逻辑执行之前、之后或周围动态添加横切关注点。