前言

  项目中我们经常会用到aop切面,比如日志记录;这里简单记录一下springboot是如何使用aop

  spring对aop的配置,来自springboot参考手册,Common application properties:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#common-application-properties

# AOP
spring.aop.auto=true # Add @EnableAspectJAutoProxy.
spring.aop.proxy-target-class=true # Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).

  maven引包

        <!--aop 面向切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--slf4j-log4j12 日志管理-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>

  Aspect 切面

/**
* Aspect 切面
* 日志切面
*/
@Aspect
@Component
public class LogAspect { /**
* slf4j日志
*/
private final static Logger logger = LoggerFactory.getLogger(LogAspect.class); /**
* Pointcut 切入点
* 匹配cn.controller包下面的所有方法
*/
@Pointcut("execution(public * cn.controller.*.*(..))")
public void webLog(){} /**
* 环绕通知
*/
@Around(value = "webLog()")
public Object arround(ProceedingJoinPoint pjp) {
try {
logger.info("1、Around:方法环绕开始.....");
Object o = pjp.proceed();
logger.info("3、Around:方法环绕结束,结果是 :" + o);
return o;
} catch (Throwable e) {
logger.error(pjp.getSignature() + " 出现异常: ", e);
return Result.of(null, false, "出现异常:" + e.getMessage());
}
} /**
* 方法执行前
*/
@Before(value = "webLog()")
public void before(JoinPoint joinPoint){
logger.info("2、Before:方法执行开始...");
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); } /**
* 方法执行结束,不管是抛出异常或者正常退出都会执行
*/
@After(value = "webLog()")
public void after(JoinPoint joinPoint){
logger.info("4、After:方法最后执行.....");
} /**
* 方法执行结束,增强处理
*/
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret){
// 处理完请求,返回内容
logger.info("5、AfterReturning:方法的返回值 : " + ret);
} /**
* 后置异常通知
*/
@AfterThrowing(value = "webLog()")
public void throwss(JoinPoint joinPoint){
logger.error("AfterThrowing:方法异常时执行.....");
}
}

  效果

  访问获取所有用户接口

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springBoot

  码云:https://gitee.com/huanzi-qch/springBoot

最新文章

  1. Angular自定义指令(directive)
  2. p4lang/switch make bm-switchsai 出现内存不足导致的Error
  3. 【如何快速的开发一个完整的iOS直播app】(播放篇)
  4. bzoj3514Codechef MARCH14 GERALD07加强版
  5. VFL示例
  6. 连续多行输入--C++ 中字符串标准输入的学习及实验(续篇)
  7. Boost库
  8. C#。5 函数 类
  9. 定时关机命令-shutdown
  10. 转载:牛魔王的世界观 &#187;谈谈ie6不支持min-height与max-height的解决方法
  11. 暴力破解UltraEdit v21 无需注册
  12. [Swust OJ 1097]--2014(数位dp)
  13. JAVA中浅复制与深复制 - coolmist - ITeye技术网站
  14. win8安装mysql5.5最后配置没有反应
  15. Redis进阶实践之三如何在Windows系统上安装安装Redis
  16. golang自定义路由控制实现(一)
  17. UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划
  18. SRD_PreloaderCore
  19. mui中confirm在苹果出现bug,confirm点击确定跳转页面再返回后,页面被遮罩盖住无法使用
  20. [android] 安卓进程优先级&amp;为什么使用服务

热门文章

  1. Eclipse搭建SSH框架(Struts2+Spring+Hibernate)
  2. 负载均衡器之 Haproxy
  3. 用JavaScript制作简单的计算器
  4. Scala知识点汇总
  5. C语言+嵌入式SQL+DB2开发经验总结
  6. QEMU KVM libvirt手册(2): monitor
  7. Openvswitch手册(9): Flow
  8. struts2 简单注解配置代替xml配置文件
  9. 【腾讯Bugly干货分享】WebSocket 浅析
  10. Python 列表详细使用