AOP
AOP术语
作用:保证各步骤之间的良好隔离性,保证源代码的无关性。
AOP处理具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理
- 切面(Aspect):业务流程运行的某个特定步骤,应用运行过程的关注点,通常称为横切关注点
- 连接点(JoinPoint):程序执行过程中明确的点,如方法的调用,异常的抛出
-增强处理(Advice):AOP特点切入点执行的增强处理,如before、around等 - 切入点(PointCut):可以插入增强处理的连接点
Annotation方式的AOP
首先保证XML配置文件有下面一句来启动AspectJ支持:
<aop:aspectj-autoproxy/>
或者不在XML中配置,但要在配置文件中加上
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator">
Aspect
使用@Aspect注解即可
增强处理
Before
使用Before时需要指定Value值,表示切入点
@Aspect
public class BeforeAdvice{
@Before("execution(* org.crazyint.app.service.impl.*.*(...))")
public void before(){...}
}
@Before会在程序执行前加入增强…一切都是在主程序无知条件下进行的
AfterReturning
在目标方法正常完成后被加入,依然要指定value(PointCut),可以指定returning,可通过该形参访问目标方法返回值
@Aspect
public class AfterReturningAdvice{
@AfterReturing(returning="rvt",pointcut=execution(org.crazyint.app.service.impl.*.*(...))")
public void log(Object rvt){
System.out.println(rvt);
}
AfterThrowing
用于处理程序中未处理的异常,也需要指定value,并需要指定throwing,用来访问目标方法所抛出的异常
@Aspect
public class AfterThrowingAdvice{
@AfterThrowing(throwing="ex",pointcut="exectution(..)")
public void Throwing(Throwable ex){System.out.println(ex)}
}
After
用于目标方法成功完成后加入,和Before相似,不叙述
Around
功能十分强大,近似于Before和AfterThrowing,但是需要在线程安全的环境中使用,没有必要使用Around增强处理
使用Around时,需要将第一个参数定义为ProceedingJoinPoint,为JoinPoint的子类
访问目标方法参数
访问目标方法需要将定义增强处理方法时将第一个参数定义为JoinPoint类型
,JointPoint有如下常用方法
- Object[] getArgs():返回执行目标方法时的参数
- Signature getSignature():返回被增强的方法的相关信息
- Object getTarget(): 返回被加入增强处理的目标对象
- Object getThis():返回AOP框架为目标对象生成的代理对象
定义切入点
@Aspect
public class SystemArchitecture{
@PointCut("exectution(* org.crazyint.app.service.impl.Chain*.say(...))")
public void myPoint(){
}
}
引用切入点
@Aspect
public class usePoint{
@before(pointcut="SystemArchitecture.myPoint()")
public void example(){...}
}
切入点指示符
- execution :匹配执行方法的连接点,用于表达式开头
- modifiers-pattern :指定方法修饰符,支持通配符,可以省略
- ret-type-pattern :指定方法返回值类型,可以用*表示
- declare-type-pattern :指定方法所属的类,可以省略
- name-pattern :指定匹配的方法名,用*匹配所有方法
- param-pattern :指定方法声明的形参列表,支持两个通配符,*和…
- throws-pattern :指定方法抛出的异常
- within :限定匹配类型的连接点
- this :用于限定AOP代理必须是指定类型的实例,匹配对象所有连接点
- target :限定目标对象必须是指定类型的实例,匹配对象所有的连接点
- args :要求参数类型是指定类型的实例
- && :要求连接点同时匹配两个切入点表达式
- ||:要求连接点匹配任意一个切入点表达式
- !:要求连接点不匹配指定切入点表达式