- 新建一个切面类,定义要切入的方法及如何切入即可,不用写入到逻辑代码中
@Aspect //声明这是一个切面类
@Component //保证被扫描到
public class RequestAspect {
private Logger logger=Logger.getLogger(RequestAspect.class);
@Pointcut("execution(public * com.java1234.controller.*.*(..))") //设置切点,对任意返回值、controller包下任意类、任意方法都切入
public void log(){
}
@Before("log()")
public void doBefore(JoinPoint joinPoint){ //执行前要调用的
//以info等级打印日志
logger.info("方法执行前...");
//获取request
ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=sra.getRequest();
//通过request获取url、IP等
logger.info("url:"+request.getRequestURI());
logger.info("ip:"+request.getRemoteHost());
//获取提交方法(get、post)
logger.info("method:"+request.getMethod());
//获取方法名
logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//获取参数列表
logger.info("args:"+joinPoint.getArgs());
//得到的参数列表是个数组,打印第一个
Student student=(Student) joinPoint.getArgs()[0];
//打印这传入的第一个参数
System.out.println(student);
}
@After("log()")
public void doAfter(JoinPoint joinPoint){
logger.info("方法执行后...");
}
@AfterReturning(returning="result",pointcut="log()") //方法返回后要调用的
public void doAfterReturning(Object result){
logger.info("方法返回值:"+result); //打印执行此方法的返回值(比如“添加成功”这样的提示信息)
}
}
- controller那边一有方法被执行,这些日志信息就被切入到方法执行过程打印出来
- 代码实例:D:/SpringBootJpa/aspect/RequestAspect
最后更新时间:
这里可以写作者留言,标签和 hexo 中所有变量及辅助函数等均可调用,示例:
http://47.107.237.149/2019/04/30/SpringBoot学习之AOP/