衆所周知,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