1.什么是AOP
面向方面(切面)Aspect编程,与OOP不同 OOP所关注的重点是类,封装.AOP所关注的重点切面功能. AOP是对OOP的补充,从程序结构上进行改善和提升. AOP在Spring Framework中的作用如下
1)声明性事务管理
2)自定义切面,用AOP来完善OOP的使用。
Spring中的AOP代理由IOC容器负责生成和管理,并且各个组件之间的依赖关页由IOC容器管理。所以AOP的目标可以是IOC容器中的bean。
2.AOP相关概念
1)切面(Aspect)
共通处理,可以切入到多个目标对象或方法,又名关注点。
2)切入点(Pointcut)
匹配的连接点的集合.以表达式方式指定一批连接点
3)连接点(Joinpoint)
在程序执行过程中某个特定的点, 比如某方法调用的时候或者处理异常的时候。
4)通知(Advice)
切面方法在连接点上执行动作的时机. 比如方法调用前,方法调用后,方法调用前后,异常发生后等
5)目标对象(Target Object)
6)AOP代理(AOP Proxy)
Spring容器动态创建的对象,该代理对象可以调用切面方法和目标对象方法. 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
3.通知
1)前置通知:Before advice 在调用目标对象方法之前执行切面方法
2)后置通知:After returning advice 在调用目标对象方法之后执行切面方法,(目标方法没有异常可以使用)
3)最终通知:After (finally) advice 在调用目标对象方法之后执行切面方法,(目标方法有无异常都可以使用)
4)环绕通知:Around Advice 在调用目标对象方法之前,之后执行切面处理
5)异常通知:After throwing advice 在调用目标方法出现异常时,执行切面方法
try{
//前置通知
//环绕通知前期处理
//调用目标对象的业务方法
//环绕通知后期处理
//后置通知
}catch(Exception e){
//异常通知
}finally{
//最终通知
}
4.切入点表达式
*1) execution - 限定匹配方法执行的连接点
execution (modifiers-pattern? ret-type-pattern declaring-type-
pattern? name-pattern(param-pattern) throws-pattern?)
示例1. 匹配任意公共方法
execution (public * *(..))
示例2. 匹配任何一个名字以“set”开始的方法
execution (* set*(..))
示例3. 匹配AccountService定义的任意方法
execution (* com.xyz.service.AccountService.*(..))
示例4. 匹配在service包中定义的任意方法
execution (* com.xyz.service.*.*(..))
示例5. 匹配在service包或其子包中定义的任意方法
execution (* com.xyz.service..*.*(..))
*2) within - 限定匹配一个或多个类型的连接点
示例1. 匹配在service包中的所有类型的任意方法
within (com.xyz.service.*)
示例2. 匹配在service包及子包中的所有类型的任意方法
within (com.xyz.service..*)
示例3.匹配 AccountService中的任意方法
within (com.xyz.service.AccountService)
3) this - 限定匹配一个代理类型的连接点
示例1. 匹配实现了AccountService接口的代理对象的任意连接点
this (com.xyz.service.AccountService)
4) target - 限定匹配一个目标对象类型的连接点
示例1. 匹配实现AccountService接口的目标对象的任意连接点
target (com.xyz.service.AccountService)
5) args - 限定匹配连接点的方法参数
示例1. 匹配方法只有一个参数,并且是Serializable的
args(java.io.Serializable)
*6) bean - 限定匹配对象名称
示例1. 匹配bean元素 id名为"personService"的对象
bean(personService)
示例2. 匹配bean元素id名为"*Service"的对象
bean(*Service)
5.AOP注解的使用
1)在xml配置中开启注解解析器
<aop:aspectj-autoproxy/>
2)在切面Bean中可使用的AOP注解
@Aspect : 将Bean组件指定为切面组件
@Pointcut : 指定切入点表达式
@Before : 前置通知
@AfterReturning : 后置通知
@After : 最终通知
@Around : 环绕通知
@AfterThrowing : 异常通知