springboot的AOP應用詳解與demo

衆所周知,AOP是spring的重要思想,那麼springboot怎麼使用AOP呢?AOP的作用是什麼?

AOP主要的思想就是切面編程,這種思想主要是想把我們的關注點統一提取出來統一管理。多的不說進入代碼時刻

我用的是gradle版本管理工具,aop導入包

compile 'org.aspectj:aspectjtools:1.8.1'

然後我們先寫一個控制層類,讓aop來切這個類

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

import javax.validation.Valid;


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

  @Autowired
  private GirlService girlService;

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

}

然後再寫一個aop類

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);
    }
}

 

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的特性來決定它的應用。

小demo的github地址私信QQ:1391086179

 

 

 

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