我们在开发过程中,或许会想要拦截一下请求看请求都做了些什么,比如参数,比如执行事件,等。
这时,我们就需要使用到AOP的编程思想。那么在springBoot中使用AOP是怎样的呢?
非常简单,请看下面的类.
当然,这里只是象征性写了个执行后的方法、环绕方法,和一个切面的声明。
需要注意的是,这个方法必须写在启动类的目录里,不然不被加载。。。。
详情可以查看一下springboot的启动类,@SpringBootApplication所加载的路径。
package aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Aspect//此注解声明这时一个切面类
@Component//将此类交给spring的容器进行管理
public class MapperAspect {
//声明log日志,
private final Logger logger = LoggerFactory.getLogger(this.getClass());
//切面执行完之后
@AfterReturning("execution(* com.changgou.*.dao..*.*(..))")
public void logServiceAccess(JoinPoint joinPoint) {
System.out.println("====================");
log.info("Completed: " + joinPoint);
}
/**
* 定义切点,也就是需要监控的地方的声明,表达式可以使用通配符
* 监控com.changgou.*.dao.*Mapper包及其子包的所有public方法
*/
@Pointcut("execution(* com.changgou.*.dao..*.*(..))")
private void pointCutMethod() {
}
/**
* 声明环绕通知
*
* @param pjp
* @return
* @throws Throwable
*/
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("====================");
long begin = System.nanoTime();
Object obj = pjp.proceed();
long end = System.nanoTime();
log.info("调用Mapper方法:{},参数:{},执行耗时:{}纳秒,耗时:{}毫秒",
pjp.getSignature().toString(), Arrays.toString(pjp.getArgs()),
(end - begin), (end - begin) / 1000000);
return obj;
}
}