1. 程式人生 > >Spring AOP 執行順序。

Spring AOP 執行順序。

 兩個不同優先順序aop是攔截登入方法,執行順序。

package com.leusysm.mgr.interceptor;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author zhouhaiming  Email: 
[email protected]
* @date 2018/11/21 10:51 */ @Component @Aspect @Order(-3) public class MessageQueueAopAspect1 { private static final Logger LOG = LoggerFactory.getLogger(MessageQueueAopAspect1.class); @Pointcut("execution(public * com.leusysm.mgr.controller.CasController.login(..))") private void pointCutMethod() { } //宣告前置通知 @Before("pointCutMethod()") public void doBefore(JoinPoint point) { LOG.info("MessageQueueAopAspect1:doBefore"); return; } //聲明後置通知 @AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue") public void doAfterReturning(JoinPoint point,Object returnValue) { LOG.info("MessageQueueAopAspect1:doAfterReturning"); } //宣告例外通知 @AfterThrowing(pointcut = "pointCutMethod()", throwing = "e") public void doAfterThrowing(Exception e) { LOG.info("MessageQueueAopAspect1:doAfterThrowing"); } //宣告最終通知 @After("pointCutMethod()") public void doAfter() { LOG.info("MessageQueueAopAspect1:doAfter"); } //宣告環繞通知 @Around("pointCutMethod()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { LOG.info("MessageQueueAopAspect1:doAround-1"); Object obj = pjp.proceed(); LOG.info("MessageQueueAopAspect1:doAround-2"); return obj; } }
package com.leusysm.mgr.interceptor;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author zhouhaiming  Email: 
[email protected]
* @date 2018/11/21 10:53 */ @Component @Aspect @Order(-4) public class MessageQueueAopAspect2{ private static final Logger LOG = LoggerFactory.getLogger(MessageQueueAopAspect2.class); @Pointcut("execution(public * com.leusysm.mgr.controller.CasController.login(..))") private void pointCutMethod() { } //宣告前置通知 @Before("pointCutMethod()") public void doBefore(JoinPoint point) { LOG.info("MessageQueueAopAspect2:doBefore"); return; } //聲明後置通知 @AfterReturning(pointcut = "pointCutMethod()", returning = "returnValue") public void doAfterReturning(JoinPoint point,Object returnValue) { LOG.info("MessageQueueAopAspect2:doAfterReturning"); } //宣告例外通知 @AfterThrowing(pointcut = "pointCutMethod()", throwing = "e") public void doAfterThrowing(Exception e) { LOG.info("MessageQueueAopAspect2:doAfterThrowing"); } //宣告最終通知 @After("pointCutMethod()") public void doAfter() { LOG.info("MessageQueueAopAspect2:doAfter"); } //宣告環繞通知 @Around("pointCutMethod()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { LOG.info("MessageQueueAopAspect2:doAround-1"); Object obj = pjp.proceed(); LOG.info("MessageQueueAopAspect2:doAround-2"); return obj; } }

 根據order的不同執行順序不一樣。下面是兩個aop的執行順序,order越小優先順序越高。

2018-12-04 10:03:39.864 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect2 -MessageQueueAopAspect2:doAround-1
2018-12-04 10:03:39.865 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect2 -MessageQueueAopAspect2:doBefore
2018-12-04 10:03:39.865 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect1 -MessageQueueAopAspect1:doAround-1
2018-12-04 10:03:39.865 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect1 -MessageQueueAopAspect1:doBefore
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect1 -MessageQueueAopAspect1:doAround-2
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect1 -MessageQueueAopAspect1:doAfter
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect1 -MessageQueueAopAspect1:doAfterReturning
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect2 -MessageQueueAopAspect2:doAround-2
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect2 -MessageQueueAopAspect2:doAfter
2018-12-04 10:03:40.232 [qtp1523196930-47] INFO  c.g.l.m.i.MessageQueueAopAspect2 -MessageQueueAopAspect2:doAfterReturning