springboot中使用aop技術
aop是面向切面編程的意(yi)思,它可以需(xu)要先(xian)選擇一些切入(ru)點,然(ran)后對這些切入(ru)點進行攔截,注(zhu)入(ru)統一的代碼(ma)邏輯,這也是解耦的一種方(fang)式,也是為了避免重復的代碼(ma),讓(rang)開發人員把關注(zhu)點放在業務上(shang)。
引用包
'org.springframework.boot:spring-boot-starter-aop'
添加切入點
/**
* 基于com.lind.basic.controller包下的方法進行攔截.
*/
@Aspect
@Component
public class AopPrintConstController {
private static final Logger logger = LoggerFactory.getLogger(AopPrintConstController.class);
/**
* 橫切點,哪些方法需要被橫切.
*/
@Pointcut(value = "execution(public * com.lind.basic.controller..*.*(..))")
public void cutOffPoint() {
}
/**
* @param joinPoint 具體的方法之前執行.
*/
@Before("cutOffPoint()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
logger.info("cutOffPoint.before...");
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
String requestURI = request.getRequestURI();
String remoteAddr = request.getRemoteAddr(); //這個方法取客戶端ip"不夠好"
String requestMethod = request.getMethod();
String declaringTypeName = joinPoint.getSignature().getDeclaringTypeName();
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
logger.info("請求url=" + requestURI + ",客戶端ip=" + remoteAddr + ",請求方式=" + requestMethod + ",請求的類名=" + declaringTypeName + ",方法名=" + methodName + ",入參=" + args);
}
/**
* 解用于獲取方法的返回值.
*
* @param obj 返回值
*/
@AfterReturning(returning = "obj", pointcut = "cutOffPoint()")
public void doBefore(Object obj) throws Throwable {
logger.info("RESPONSE : " + obj);
}
}
測試
當我們(men)訪問controller下的(de)接(jie)口下,在(zai)控制(zhi)臺中將輸出(chu)方法執行(xing)前和執行(xing)后的(de)結果(guo)
com.lind.basic.AopPrintConstController : 請求url=/hello/1,客戶端ip=0:0:0:0:0:0:0:1,請求方式=GET,請求的類名=...
com.lind.basic.controller.H com.lind.basic.AopPrintConstController : RESPONSE : <200 OK,com.lind.basic.entity.Token@249f92d9,{}>
感想
事實上,springboot真的是一個強大的腳手架,它幫助(zhu)我們把很多依賴都結(jie)合(he)(he)了(le),像今天說的aop,事實上springboot幫我們把以下(xia)包都結(jie)合(he)(he)在一起了(le),讓開(kai)發人員引用時更方便。
springboot-aop集(ji)成了
- spring-aop,
- aspectjrt,
- spectjweaver