AOP:Aspect Oriented Programming,面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
OOP引入封装、继承、多态等概念来建立一种对象层次结构。
AOP则利用一种称为“横切”的技术,剖开对象内部,并将公共行为封装到可重用模块,从而减少重复代码,降低耦合。
一、AOP元素
一个完整的AOP是由多个元素组成的,AOP由切面、切点、连接点、目标对象、回调 五个元素构成
切面(Aspect):指封装横切到系统功能的类,包含通知和切点
切点(Poincut):定义切面插入在哪些方法上,确定切面使用范围
连接点(Join point):是在应用执行过程中满足切点范围的具体的点
通知(Advice) :定义了切点处所要执行的程序代码以及执行时机
目标对象(Target Object):某种能力要对某个对象使用,这个对象就是目标对象
二、AOP五种通知类型
1、Before: 前置通知,在方法之前执行
2、After:后置通知,在方法之后执行,无论方法内部是否抛出异常
3、AfterReturning:后置返回通知,在方法之后执行并且方法内部不能抛出异常
4、AfterThrowing:后置异常通知,在方法内部抛出异常时执行
5、Around: 环绕通知,在方法之前和之后都执行
前四种通知的方法里通过JoinPoint参数获取连接点信息,比如参数信息等,方便进行处理。
环绕通知的方法里则通过ProceedingJoinPoint参数来获取连接点信息。
三、Spring AOP实现
1.基于XML方式
(1)新增一个日志记录服务类“LogService”,并配置到Spring容器中(这里的Spring容器是基于XML方式的)
(2)引入Spring AOP相关依赖
(3)修改Spring配置文件的头部,添加以下红框内容
(4)在Spring配置文件中加入AOP切面配置
这里示例的是before、after-returing通知,其中after-returing的returning绑定LogService
2.基于注解方式
由于采用基于XML的方式来启用AOP要写的代码过于繁杂,所以一般会使用更加简便的注解方式。
(1)在Spring配置文件中添加启用基于 AspectJ 注解的 AOP 自动代理功能的配置元素
(2)在LogService类添加以下内容
①在LogService类前添加@Aspect注解
②添加切点方法pointcut()
③在writeLog方法前添加@Before注解
value属性指定了要应用通知的切点表达式,表示要匹配名为pointcut()的切点方法。
④在writeEndLog方法前添加@AfterReturning注解
这里还添加了AfterThrowing异常通知
3.运行结果
运行任意一个执行了service包以下的方法的测试类,结果以下
Around环绕通知
环绕通知的方法里通过ProceedingJoinPoint参数来获取连接点信息,与其他四种不太一样
要达到上述Before+After-returning+AfterThrowing三种通知的效果,应该写如下方法并加上@Around注解
总结
AOP(Aspect Oriented Programming)是一种面向切面的编程思想。面向切面编程是将程序抽象成各个切面,即解剖对象的内部,将那些影响了多个类的公共行为抽取到一个可重用模块里,减少系统的重复代码,降低模块间的耦合度,增强代码的可操作性和可维护性。
通过AOP编程可以实现在不改变原有类的前提下为系统中的业务组件添加某种通用功能。