文章目录

  • 规则表达式含义
  • 规则表达式 组合使用
  • 示例

规则表达式含义

任意公共方法的执行:
execution(public * *(..))
##public可以省略, 第一个* 代表方法的任意返回值 第二个参数代表任意包+类+方法 (..)任意参数任何一个以“set”开始的方法的执行:
execution(* set*(..))UserService接口的任意方法:
execution(* com.coffee.service.UserService.*(..))定义在com.coffee.service包里的任意方法的执行:
execution(* com.coffee.service.*.*(..))
#第一个 .* 代表任意类, 第二个 .* 代表人以方法定义在service包和所有子包里的任意类的任意方法的执行:
execution(* com.coffee.service..*.*(..))
# ..* 代表任意包或者子包定义在com.coffee包和所有子包里的UserService类的任意方法的执行:
execution(* com.coffee..UserService.*(..))")

规则表达式 组合使用

使用 || , or

使用 && , and

使用

示例

package com.example.aop;import com.example.beans.PageResultBean;
import com.example.beans.ResultBean;
import com.example.entity.UnloginException;
import com.example.exception.CheckException;
import org.aspectj.lang.ProceedingJoinPoint;
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;/*** 使用@Aspect注解将此类定义为切面类* 根据晓风轻著的ControllerAOP所修改* 晓风轻大佬(很大的佬哥了):https://xwjie.github.io/*/
@Aspect
@Component
public class AopController {private static final Logger logger = LoggerFactory.getLogger(AopController.class);ThreadLocal<ResultBean> resultBeanThreadLocal = new ThreadLocal<>();ThreadLocal<PageResultBean<?>> pageResultBeanThreadLocal = new ThreadLocal<>();ThreadLocal<Long> start = new ThreadLocal<>();/*** 定义一个切点*/@Pointcut(value = "execution(public com.example.beans.PageResultBean *(..)))")public void handlerPageResultBeanMethod() {}@Pointcut(value = "execution(public com.example.beans.ResultBean *(..)))")public void handlerResultBeanMethod() {}@Around("handlerPageResultBeanMethod()")public Object handlerPageResultBeanMethod(ProceedingJoinPoint pjp) {start.set(System.currentTimeMillis());try {pageResultBeanThreadLocal.set((PageResultBean<?>)pjp.proceed());logger.info(pjp.getSignature() + " 方法执行耗时:" + (System.currentTimeMillis() - start.get()));} catch (Throwable e) {ResultBean<?> resultBean = handlerException(pjp , e);pageResultBeanThreadLocal.set(new PageResultBean<>().setMsg(resultBean.getMsg()).setCode(resultBean.getCode()));}return pageResultBeanThreadLocal.get();}@Around("handlerResultBeanMethod()")public Object handlerResultBeanMethod(ProceedingJoinPoint pjp) {start.set(System.currentTimeMillis());try {resultBeanThreadLocal.set((ResultBean<?>)pjp.proceed());logger.info(pjp.getSignature() + " 方法执行耗时:" + (System.currentTimeMillis() - start.get()));} catch (Throwable e) {resultBeanThreadLocal.set(handlerException(pjp , e));}return resultBeanThreadLocal.get();}/*** 封装异常信息,注意区分已知异常(自己抛出的)和未知异常*/private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {ResultBean<?> result = new PageResultBean();logger.error(pjp.getSignature() + " error ", e);// 已知异常if (e instanceof CheckException) {result.setMsg(e.getLocalizedMessage());result.setCode(ResultBean.FAIL);} else if (e instanceof UnloginException) {result.setMsg("Unlogin");result.setCode(ResultBean.NO_LOGIN);} else {result.setMsg(e.toString());result.setCode(ResultBean.FAIL);}return result;}
}

转自 https://www.cnblogs.com/javazhiyin/p/9993299.html

Spring boot 之 aop pointcut execution规则详解相关推荐

  1. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

  2. springboot aop的execution 表达式详解

    Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式  execu ...

  3. spring boot rabbitmq_Spring Boot2(十):RabbitMQ 详解

    关于SpringBoot整合RabbitMQ,我看了微笑哥的博文,实在不知道还有比这更加全面的了.于是我转载过来了.. RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起 ...

  4. spring boot项目中使用logback日志详解

    1. spring boot中的默认日志 SpringBoot为Java Util Logging,Log4J2和Logback提供了默认配置.SpringBoot默认配置日志输出到控制台,同时还提供 ...

  5. Spring学习之AOP的切点表达式详解

    1.背景知识 在Sping中使用AOP的主要工作是配置织入关系,使用<aop:config>标签代表这一段是织入关系的配置 首先,用<aop:aspect>标签声明一个切面,这 ...

  6. Spring boot(八):RabbitMQ详解

    RabbitMQ介绍 RabbitMQ既一个消息队列,主要用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多.消息中间件最主要的作用是解耦,中 ...

  7. spring boot 教程(三)配置详解

    在大部分情况下,我们不需要做太多的配置就能够让spring boot正常运行.在一些特殊的情况下,我们需要做修改一些配置,或者需要有自己的配置属性. Spring Boot 支持多种外部配置方式 这些 ...

  8. Spring Boot 开发环境热部署(HotSwap)详解

    前言 Spring Boot 提出了多项开箱即用的功能特性,但归根到底还是围绕简化应用的创建.开发.运行.开发环境下我们经常对项目代码进行变动,如果每次都重新启动应用会浪费我们大量时间,为此就产生了多 ...

  9. 关于Spring Boot WebSocket整合以及nginx配置详解

    这篇文章主要给大家介绍了关于Spring Boot WebSocket整合以及nginx配置的相关资料,文中通过示例代码给大家介绍的非常详细,相信对大家的学习或者工作具有一定的参考学习价值,需要的朋友 ...

最新文章

  1. java 文件 缓冲区大小_Java web 中文件下载遇到的缓冲大小问题
  2. 中国湿敏元器件市场研发方向预测与前景趋势研究报告2022版
  3. 十六、PHP框架Laravel学习笔记——构造器的增删改
  4. linux mysql 安装innodb_在ubuntu Mysql 5.7 安装InnoDB Memcached 插件
  5. Redis 如何处理已经过期的数据?
  6. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
  7. Codeforces914D Bash and a Tough Math Puzzle
  8. iss版本服务器读取_【IIS7服务器管理工具下载】IIS7服务器管理 v2.1.9 官方版-开心电玩...
  9. layUI数据表格(table)
  10. ArcGIS Server Manager打不开(运行时错误)
  11. UVALive 5135 Mining Your Own Business 双连通分量
  12. Exchange server 2010系列教程之十一 整合AD RMS与exchange 2010
  13. python调整PPT文档样式
  14. NanoMsg框架|C#中Nanomsg的PAIR和BUS使用
  15. 火影抽卡模拟器1.0.5
  16. Facebook 全面禁止口罩广告,各平台如何打击哄抬、售假
  17. SSL_read: Failure in SSL library (protocol error?)
  18. 渗透前期学习资源分享
  19. adb shell top
  20. 可计算性、可判定性和可满足性

热门文章

  1. android 11 存储权限,Android下的数据存储与访问、权限
  2. 我们知道CDN护航了双11十年,却不知道背后有那么多故事……
  3. R语言epiDisplay包mlogit.display函数无序多分类logistic回归模型的汇总统计信息(各分组模型对应系数及标准差、相对危险降低率RRR值及其置信区间、AIC值等)、保存到csv
  4. linux 如何连接远程,如何连接远程LINUX服务器
  5. 关于List index out of bounds(0)的问题
  6. SRS流媒体服务器SDP解析流程
  7. Unity UGUi之Panel
  8. keil c51 关键字
  9. 结巴分词 java 权重_结巴分词 (转载)
  10. 在simulink中采用模块搭建了基于双二阶广义积分器的三相锁相环,整个仿真环境完全离散化