1. 程式人生 > >SpringBoot 學習記錄: AOP

SpringBoot 學習記錄: AOP

借鑑了廖師兄的在mock上的教學視訊,在此感謝:P

對於AOP我就不廢話了,SpringBoot 對於AOP的支援做的非常好。

第一步先在maven中導包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步建立HttpAspect.java 這個類

直接懟程式碼了


package com.imooc
.aspect; 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; @Aspect @Component public class HttpAspect { private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); @Pointcut("execution(public * com.imooc.controller.GirlController.*(..))") public void log() { } @Before("log()"
) public void doBefore(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //url logger.info("url={}", request.getRequestURL()); //method 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("222222222222"); } @AfterReturning(returning = "object", pointcut = "log()") public void doAfterReturning(Object object) { logger.info("response={}", object.toString()); } }
  • 這裡我們需要注意的是給類打上@Aspect(使用AOP)和Component(標明元件)。
  • 使用@pointcut來標註對哪些類來進行AOP,以及使用的方法名。

我們使用如下三個標註來設定AOP的時機
- @Before
- @After
- @AfterReturning

  • 使用JoinPoint來獲取類的屬性以及引數的屬性

AspectJ使用org.aspectj.lang.JoinPoint介面表示目標類連線點物件,如果是環繞增強時,使用org.aspectj.lang.ProceedingJoinPoint表示連線點物件,該類是JoinPoint的子介面。任何一個增強方法都可以通過將第一個入參宣告為JoinPoint訪問到連線點上下文的資訊。我們先來了解一下這兩個介面的主要方法:
JoinPoint
 java.lang.Object[] getArgs():獲取連線點方法執行時的入參列表;
 Signature getSignature() :獲取連線點的方法簽名物件;
 java.lang.Object getTarget() :獲取連線點所在的目標物件;
 java.lang.Object getThis() :獲取代理物件本身;