AOP配置(注解)
基本的注解配置
@Aspect
@Pointcut
- 位置:方法定义上方
- 作用:使用**当前的方法名**作为切入点引用名称
@Pointcut("execution(* *..*(..))")
public void pt(){ }
public class AOPPointcut{
@Pointcut("execution(* *..*(..))")
public void pt1(){
}
}
@Before
@Before("AOPPointcut.pt1()")
public void before(JoinPoint jp){
Object[] args = jp.getArgs();
System.out.println("前置...before ..." + args[0] + args[1]);
}
@After
@After("AOPPointcut.pt1()")
public void after(){
System.out.println("后置...after ...");
}
@AfterReturning
@AfterReturning("AOPPointcut.pt1()")
public void afterReturing(){
System.out.println("返回后...afterReturing ...");
}
@AfterThrowing
@AfterThrowing("AOPPointcut.pt1()")
public void afterThrowing(){
System.out.println("抛出异常后...afterThrowing ...");
}
@Around
@Around("AOPPointcut.pt1()")
public Object around(ProceedingJoinPoint pjp){
System.out.println("环绕前...around ... before");
Object ret = null;
try {
ret = pjp.proceed();
} catch (Throwable throwable) {
System.out.println("环绕抛原方法异常...around... exception..." + throwable.getMessage());
}
System.out.println("环绕后...around ... after" + ret);
return ret;
}
注解后添加参数
注解配置:
@AfterReturning(value = "AOPPointcut.pt1()",returning = "ret")
public void afterReturing(Object ret){
System.out.println("返回后...afterReturing ..." + ret);
}
@AfterThrowing(value = "AOPPointcut.pt1()", throwing = "t")
public void afterThrowing(Throwable t){
System.out.println("抛出异常后...afterThrowing ..." + t.getMessage());
}
XML配置:
<aop:config>
<aop:pointcut id="pt" expression="execution(* *..*(..))"/>
<aop:aspect ref="myAdvice">
<aop:after-returning method="afterReturing" pointcut-ref="pt" returning="ret"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="pt" throwing="t"/>
</aop:aspect>
</aop:config>
AOP注解开发通知执行顺序控制
Spring AOP运行机制
- 同个通知类中,相同通知类型以方法名排序为准
- 不同通知类中,以类名排序为准
- 使用@Order()注解通过变更bean的加载顺序改变通知的加载顺序
@Before("AOPPointcut.pt1()")
public void aop002log(){
System.out.println("前置...before2 ..." );
}
@Before("AOPPointcut.pt1()")
public void aop003log(){
System.out.println("前置...before1 ..." );
}