什么是AOP
AOP(Aspect Oriented Programming),即面向切面编程。众所周知,OOP(面向对象编程)通过的是继承、封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。OOP从纵向上区分出一个个的类来,而AOP则从横向上向对象中加入特定的代码。AOP使OOP由原来的二维变为三维了,由平面变成立体了。
AOP采用"横切"的技术,剖解开封装的对象内部,将影响了多个类的公共行为封装到一个可重用模块。将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
简单来说讲,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
标题
简单的来说:
面向切面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP)。
OOP中模块化的关键单元是类,而在AOP中,模块化单元是切面。
那Spring AOP,AspectJ又是啥呢?
AOP是面向切面编程的思想,而Spring AOP是这种思想的技术实现!同样AspecJ也实现了AOP思想。
如果你仔细阅读源码,你会发现SpringAOP居然包含AspectJ,这是因为Spring AOP借助了AspectJ的语法,但底层技术用的还是Spring自己的。
举个例子
所有的车, 比如 兰博基尼, 大众, 奔驰等车的信息是一个类, 这是相当于纵向的每一个单独的类, 而 服务修车和售后的 4s 店就属于横向的 aop 切面, 它负责车辆的售后维修, 记录车辆的维修信息等
应用场景举例
-
日志模块
日志搜集的代码一般都是从 controller层,service层中都会有,为了记录每个业务日志,显得非常的繁多和复杂, 而使用aop 就可以在入口获取请求参数,请求地址, 在业务层获取详细的日志信息,已经业务执行时间, 异常信息等, 方法执行完毕还可以获取返回值信息等 -
事务管理
调用方法前开启事务, 调用方法后提交关闭事务。
AOP的优点
1、面向切面编程使得关注点都集中在具体的业务代码中,而一些通用的,可以维护代代码健壮性的代码集中放在切面处理。
2、服务模块更简洁, 基本只有自己的业务的实现。
3、对原方法进行方法增强,且不影响原方法的正常使用。
4、使用简单可插拔的配置,在实际逻辑执行之前、之后或环绕整个业务方法动态添加横向扩展切面。
AOP 一些专业属于的整理
-
切面(Aspect)
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能。 -
通知(Advice)
通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。Spring切面可以应用5种类型的通知:
- 前置通知(Before):在目标方法被调用之前调用通知功能
- 后置通知(After):在目标方法完成之后调用通知,不关心方法的输出是什么。是“返回通知”和“异常通知”的并集。
- 返回通知(After-returning):在目标方法成功执行之后调用通知, 可获取到返回值信息
- 异常通知(After-throwing):在目标方法抛出异常后调用通知
- 环绕通知(Around)通知包裹了被通知的方法,可同时定义前置通知和后置通知。
-
切点(Pointcut)
切点定义了在何处工作,也就是真正被切入的地方,也就是在哪个方法应用通知。切点的定义会匹配通知所有要织入的一个或多个连接点。我们通常使用明确的类和方法名称,或是利用正则表达式定义所匹配的类和方法名称来指定这些切点。 -
连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为。 -
引入(Introduction)
引入让一个切面可以声明被通知的对象实现了任何他们没有真正实现的额外接口,而且为这些对象提供接口的实现。
引入允许我们向现有的类添加新方法或属性。这个新方法和实例变量就可以被引入到现有的类中,从而可以再无需修改这些现有的类的情况下,让它们具有新的行为和状态。 -
织入(Weaving)
织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以织入。编译器:切面在目标类编译时被织入。这种方式需要特殊的编译器。
类加载期:切面在目标类被引入应用之前增强该目标类的字节码。
运行期:切面在应用运行的某个时刻被织入。有任何写的不好的地方,请指出