spring boot使用 aop 處理方法的執行順序
阿新 • • 發佈:2019-02-16
引入aop
<!-- 使用aop的依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
建立切面處理類(可以做呼叫方法前校驗session的處理,因為)
package com.jzy.aspect; import com.jzy.util.PublicUtil; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /* * Created by zzb on 2017/10/23. * */ @Aspect @Component public class HttpAspect { private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); /*攔截對對包下面的girlList方法(不管裡面是什麼引數)*/ // @Before("execution(public * com.imooc.controller.EmailController.toIndex(..))") /*@Before("execution(public * com.imooc.controller.EmailController.*(..))") public void log(){ System.out.println("6666666666"); } @After("execution(public * com.imooc.controller.EmailController.*(..))") public void logAfter(){ System.out.println("7777777777777777"); }*/ /*切點為controller包下面的所有類的所有方法*/ @Pointcut("execution(public * com.jzy.controller.*.*(..))") public void log(){ } /*進入方法之前執行*/ @Before("log()") public void doBefore(JoinPoint joinPoint){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); logger.info("@Before:"+PublicUtil.getCurrentTimestamp()); /*logger.info("開始攔截"); //url logger.info("url={}",request.getRequestURL()); //method 型別(GET ,POST .....) logger.info("method={}",request.getMethod()); //ip logger.info("ip={}",request.getRemoteAddr()); //類方法 logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName() +"."+ joinPoint.getSignature().getName()); //引數 logger.info("args={}",joinPoint.getArgs());*/ } /*方法執行之後執行*/ @After("log()") public void doAfter(){ logger.info("doAfter:"+PublicUtil.getCurrentTimestamp()); } //controller中結果返回之後呼叫 @AfterReturning(returning = "object",pointcut = "log()") public void doAfterReturning(Object object){ logger.info("doAfterReturning:"+ PublicUtil.getCurrentTimestamp()); // logger.info("response={}",object.toString());//攔截到void型別的方法也會報錯 } }
controller方法
@RequestMapping(value = "/index",method = RequestMethod.GET) public String index(){ logger.info("controller:"+PublicUtil.getCurrentTimestamp()); // logger.info("郵件屬性是:"+emailProperties.toString()); // return new ModelAndView("user/index"); emailRecordReposity.findOne(1);//執行一個數據庫查詢拉開時間間隔 return "歡迎來到德萊聯盟"+ PublicUtil.getCurrentTimestamp(); }
最後附上一張驗證結果圖 (3和4由於執行的過程比較簡單看不出來先後順序,但其實@After是在Controller執行完返回結果之前執行的,總結下來,執行的順序是@Before-》myMethod->@After->myMethod返回結果-》@AfterReturning
)