天天看點

SpringBoot(六)_AOP統一處理請求

什麼是AOP
  • AOP 是一種程式設計範式,與程式設計語言無關;
  • 将通用邏輯從業務邏輯中分離出來(假如你的業務是一條線,我們不在業務線上寫一行代碼就能完成附加任務!我們會把代碼寫在其他的地方);
具體實作

(1) 引入依賴

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

(2) 建立HttpAspect.java 檔案

  • 類上加入@Aspect @Component 注解
  • 使用@Pointcut 定義一個公共的方法,定義切哪個點
  • @Before @After @AfterReturning 這三個注解是切的時間點
  • 使用org.slf4j.Logger 進行日志記錄
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 org.springframework.web.servlet.support.RequestContext;

import javax.servlet.http.HttpServletRequest;

/**
 * @Auther: curry
 * @Date: 2018/6/2 13:45
 * @Description:
 */
@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(){

    }

    @AfterReturning(pointcut = "log()",returning = "object")
    public void doAfterReturning(Object object){
        logger.info("response = {}",object);
    }
}
           

(3)進行測試

//前面省略 以下代碼
2018-06-02 19:53:17.874  INFO 10088 --- [nio-8099-exec-1] com.imooc.aspect.HttpAspect   

: url=http://localhost:8099/girls
: method = POST
: ip = 0:0:0:0:0:0:0:1
: class_method=com.imooc.controller.GirlController.girlAdd
: args = Girl{id=0, name='maomao', age=7}
: response = com.imooc.entity.Result@6a84c72f           
小彩蛋
springboot 支援列印自定義banner,隻要在resources 下面建立一個banner.txt 檔案

檔案内容,每次啟動,就會顯示下面的圖,是不是很酷

_ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永無BUG           

學習不是要麼0分,要麼100分的。80分是收獲;60分是收獲;20分也是收獲。有收獲最重要。但是因為着眼于自己的不完美,最終放棄了,那就是徹底的0分了。