1. 程式人生 > >Spring Boot框架-使用AOP處理請求

Spring Boot框架-使用AOP處理請求

pom.xml中匯入

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

新建 Package:aspect 包內建類:HttpAspect
通過註釋:Aspect和Component來建立攔截類

    @Aspect
    @Component
    public class HttpAspect {

        @Before("execution(public * com.imooc.Controller.GirlController.*(..))")//攔截GirlController類下所有的方法 ..代表任意引數
        public void log(){
            System.out.println("攔截到了!");
        }

執行順序是先執行切面程式,再執行源程式 

將切面整理為

    @Aspect
    @Component
    public class HttpAspect {
        @Pointcut("execution(public * com.imooc.Controller.GirlController.girlList(..))")
        public void log(){}//定義一個共用方法,使用Pointcut註解
        @Before("log()")
        public void doBefore(){
        }
        @After("log()")
        public void doAfter(){
        }
    }

拋棄prienln(),我們使用log日誌來記錄執行資訊

@Aspect
@Component
public class HttpAspect {

    private final static Logger logger
            = LoggerFactory.getLogger(HttpAspect.class);
    ···
    ···
    public void doAfter(){
        logger.info("22222");
    }
}

我們要通過Before來獲取請求資訊了

    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attrubutes =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attrubutes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());
        //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());
    }

那我們如何獲取返回給端的資訊呢

    @AfterReturning(returning = "object",pointcut = "log()")//用來返回資訊
    public void doAfterReturning(Object object){
        logger.info("response={}",object.toString());
    }

我們要在模板類裡新增一個toString()的方法,類似這樣

    public String toString() {
        return "Gril{" +
                "id=" + id +
                ", cupSize='" + cupSize + '\'' +
                ", age=" + age +
                '}';
    }
才能返回object物件的資料