springboot 的aop應用詳解與可運行demo

springboot的aop思想

aop是一種編程範式不是一種編程語言,支持aop的語言有很多種,今天主要介紹下springboot中aop的簡單。

spring AOP的使用
1.我們先創建一個controller方法
2.其次我們還得導入aop的相關類
compile 'org.aspectj:aspectjtools:1.8.1'
3.然後我們需要認識幾個aop的註解
@Aspect:這個註解告訴spring容器,我這個類是主要就是來做aop管理的,可能會橫切某個方法,在運行方法之前先運行這個
被註解的方法。
@Component:組件,就是要將這個類當作組件放進spring容器中,在實例化對象的時候會將這個類當作組件實例化到spring容器中

要學習AOP還得知道幾個關鍵點,切點,切入的時間
我們通常用@Pointcut來設置切點,切點可以是方法,類,參數,關鍵看自己想怎麼切

切入時間大致分爲一下幾個時間點:
@Before
@Around
@After
@AfterReturning
...
這個具體的用法看aopTest中的應用

@AfterReturning 後置返回可以獲取返回的結果
@AfterReturning(returning = "ret", pointcut = "log()")
public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容
        logger.info("RESPONSE : " + ret);
    }


之後我們還需要看一個第三方類,JoinPoint
這個對象可以獲取很多請求的屬性,具體看源碼:參數,類方法....

到此,我們的aop運用就大致結束,具體還是要知道aop的特性來決定它的應用。

 

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/hello")
public class aopTestController {

  @ResponseBody
  @GetMapping(value = "/world")
  public String aopTest(@RequestParam String name){
    return "hello"+name;
  }

}
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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 AopTest {
 
    private static final Logger logger = Logger.getLogger(AopTest.class);   //日誌,我用的log4j
 
    //配置切點
    @Pointcut("execution(* com.sso.controller..*(..))")
    public void log() {
    }
 
    @Before("log()")  //前置通知
    public void beforeExcution(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());
        //port
        logger.info("port:"+request.getRemotePort());
        //類方法
        logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //參數
        logger.info("args:"+joinPoint.getArgs());

    }
 
    @AfterReturning(returning = "ret", pointcut = "log()")  //後置返回
    public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容
        logger.info("RESPONSE : " + ret);
    }
}

 

我會將我大學到現在所有學的知識,構建在一個github項目中,需要和有類似想法的同學可以和我一起學習進步,謝謝支持,可以點贊加關注嗎,持續維護博客ing。github地址:https://github.com/xianglong123/xlSSO.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章