Spring AOP
总阅读 次
Spring AOP 介绍
AOP 为Aspect Oriented Programming的缩写,被成为面向切面编程。
AOP主要用于处理共通逻辑,例如日记记录,性能统计,安全控制,事务处理,异常处理等等。AOP可以将这些共通逻辑从普通业务逻辑代码中分离出来,这样在日后修改这些逻辑的时候就不会影响普通业务逻辑的代码。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间耦合度降低,提高程序的可重用性,同时提高了开发的效率。
方面
方面是指封装共通处理的组件,该组件被作用到其他目标组件方法上。
目标
目标是指被一个或多个方面所作用的对象。
切入点
切入点是用于指定哪些组件和方法使用方面功能,在Spring中利用一个表达式指定切入目标。
Spring提高了以下常用的切入点表达式:
- 方法限定表达式
execution(修饰符?返回类型 方法名(参数)throws 异常类型?) - 类型限定表达式
within(包名.类型) - Bean名称限定表达式
bean(”Bean的id或name属性值”)
通知
通知是用于指定方面组件和目标组件作用的时机。例如方面功能在目标方法之前或之后执行等时机。
Spring框架提供以下几种类型的通知:
- 前置通知:先执行方面功能再执行目标功能
- 后置通知:先执行目标功能再执行方面功能(目标无异常才执行方面)
- 最终通知:先执行目标功能在执行方面功能(目标有无异常都执行方面)
- 异常通知:先执行目标,抛出后执行方面
- 环绕通知:先执行方面前置通知,然后执行目标(ProceedingJoinPoint.proceed()),最后再执行方面后置部分
AOP实现原理
Spring AOP实现主要是基于动态代理技术。当Spring采用AOP配置后,Spring容器返回的目标对象,实际上是Spring利用动态代理技术生成的一个代理类型,代理类重写了原目标组件方法的功能,在代理类中调用方面对象功能和目标对象功能。两种动态代理实现:
- 利用cglib工具包
- 利用JDK Proxy API
注解实现AOP
开发步骤:
- 创建方面组件
—创建一个类,充当方面组件,实现统用业务逻辑。 - 声明方面组件
—在applicationContext.xml中开启AOP注解扫描:aop:aspectj-autoproxy/
—使用@Component注解标识这个类,将其声明为组件。
—使用@Aspect注解标识这个类,将其声明为方面组件。 - 使用方面组件
—在组件的方法上,使用注解将方面组件作用到目标组件的方法上,并设置通知类型以确认方面组件调用的时机。
- 前置通知,方面组件方法上增加注解:
@Before(“within(controller..*)”)
public void log(){} - 后置通知、最终通知使用方法与前置一致,只需将注解改为@AfterReturning、@After即可。
- 环绕通知
@Around(“within(controller..*)”)
public Object log(ProceedingJoinPoint p)throws Throwable{
//此处代码在目标组件前执行
Object obj=p.proceed();//执行目标组件方法
//此处代码在目标组件后执行
return obj;
} - 异常通知:
@AfterThrowing(pointcut=”within(controller..*)”,throwing=”e”)
public void log(Exception e){}

