切面记录日志

切面类

@Slf4j
@Aspect
@Component
public class AspectForFeign {@Pointcut("execution(public * com.keke.remote..*Feign.*(..))")public void pointcut() {}@Around("pointcut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();log.info("@Around:开始执行目标方法:{}ms", start);Object result = null;try {result = joinPoint.proceed();} catch (Exception e) {System.out.println(e.getMessage());}long end = System.currentTimeMillis();log.info("@Around:结束执行目标方法:{}ms", end);//获取方法签名       MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("方法名:{} 耗时:{}ms", methodName, end - start);//如果不返回result,则目标对象实际返回值会被置为nullreturn result;}
  • 注意:返回结果如果不返回result,则目标对象实际返回值会被置为null

@Component

  • 需要将切面类配置为bean

@Aspect

  • 标记为切面类

@Pointcut

  • 需要表达式命名,而不需要在方法体内编写实际代码。
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)

@Around

  • 环绕增强,@Pointcut和@Around联合使用等同于:
@Around("execution(public * com.keke.remote..*Feign.*(..))")

切点拦截记录访问日志

拦截器数据源

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)//注解在方法上
public @interface ApiAccess{}

拦截器业务实现代码

@Aspect
@Component
@Slf4j
public class ApiAccessAspect {@Pointcut("@annotation(com.keke.annotation.ApiAccess)")public void pointcut() {}@Around("pointcut()")public Object apiAccessAspect(ProceedingJoinPoint joinPoint) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();log.info("url:{}被访问了.....",request.getRequestURL().toString());return joinPoint.proceed(joinPoint.getArgs());}
}

@Pointcut的表达式-@annotation

限制连接点的匹配,其中连接点的主题(在 Spring AOP 中执行的方法)具有给定的 annotation。

官方案例:

任何连接点(仅在 Spring AOP 中执行方法),其中执行方法具有@Transactional annotation:

@annotation(org.springframework.transaction.annotation.Transactional)

官方的案例已经说的很清楚了,就是@annotation是匹配拥有指定注解的方法的。这里要注意,@annotation只匹配实现类中的有注解的方法,不会匹配接口中的注解方法。

看案例:

我们准备接口:

/*** @description*/
public interface IBookService {//@DkAnnotation// 这里的注解是不会被匹配的public void saveBook(String title);
}

实现类:

/*** @description*/
@Component
public class BookService implements IBookService{@Override@DkAnnotation //这里的注解会被匹配public void saveBook(String title){System.out.println("保存图书:"+title);}public void saveBook(String title,int count){System.out.println("保存"+title+","+count+"次");}
}

修改Aspect类:

/*** @description*/
@Component //将当前bean交给spring管理
@Aspect //定义为一个AspectBean
public class DkAspect {//使用@annotation配置匹配所有还有指定注解的方法@Pointcut("@annotation(com.st.dk.demo7.annotations.DkAnnotation)")private void pointCut1(){}//定义一个前置通知@Before("pointCut1()")private static void befor(){System.out.println("---前置通知---");}
}

测试:

@Testpublic void testAopPoint_annotation(){ApplicationContext ac =new AnnotationConfigApplicationContext(Appconfig.class);IBookService bean = ac.getBean(IBookService.class);bean.saveBook("程序员的修养");}

结果:

SpringAop @Pointcut(“@annotation“)\@Aspect练习相关推荐

  1. SpringAOP @PointCut 切点解析

    前言 进行Spring AOP编程,首先要声明一个切面,里面包含连接点和通知.然后把连接点作用到通知上面去,通知方法内部就是通知的逻辑.这个流程已经在博客[详解什么是Spring AOP]中给出过,而 ...

  2. SpringAOP中@annotation和@within的作用

    @annotation和@within的区别: @annotation 方法级别@within 对象级别@Pointcut("@annotation(com.ruoyi.common.ann ...

  3. IDEA配置+Spring框架

    1. IDEA环境配置 ctrl+F12查看方法结构 ctrl+H 查看类图 ctrl+D向下复制一行 Alt+Insert 提供构造/get/set/to String Ctel+Alt+T 选中代 ...

  4. 【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)

    文章目录 前言 AOP与Spring AOP @Aspect简单案例快速入门 一.@Pointcut @annotation 二.五种通知Advice 1. @Before前置通知 2. @After ...

  5. [Done]Spring @Pointcut 切点调用不到(SpringAOP嵌套方法不起作用) 注意事项

    今天在开发过程中,遇到一个问题卡了很久,测试代码如下: package spring.pointcut;import org.aspectj.lang.ProceedingJoinPoint; imp ...

  6. Spring-AOP @AspectJ切点函数之@annotation()

    文章目录 @annotation()概述 实例 @annotation()概述 @annotation表示标注了某个注解的所有方法. 下面通过一个实例说明@annotation()的用法. Annot ...

  7. Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing

    文章目录 1.AOP是什么 2.AOP中注解的含义 3.Pointcut切入点的语法 4.AOP代码实现 1.AOP是什么 AOP:Aspect Oriented Programming,翻译过来就是 ...

  8. @Aspect中@Pointcut 12种用法

    本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面3篇文章内容,不然会比较吃力. Spring系列第15篇:代理详解(java动态代理&CGLIB ...

  9. Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration

    Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration Spring Framework是基于两 ...

最新文章

  1. matlab从入门到精通-常用的几种缺失值处理方法
  2. 《大规模web服务开发技术》阅读笔记
  3. layout布局_Android ConstraintLayout 降低布局层次,布局优化首选
  4. java虚拟机手机下载_java虚拟机下载
  5. 不被重视的基础,高效地使用ADO.net连接对象
  6. 虚拟机安装 xp步骤(参照百度文库)
  7. pc端rem适配_自适应PC端网页制作使用REM
  8. 6.Exchanger-交换机
  9. 关于智能制造的思考——以中航工业为例
  10. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_38、源码编译安装Redis4.x...
  11. linux精简版远程登录,Linux下定制SSH来简化远程访问的方法
  12. 当浏览器是ie11以前版本的,跳转到ie升级页
  13. 学校做计算机教室锐捷,锐捷网络云课堂:让学生爱上每一节课
  14. 眼睛干涩胀痛:得了干眼症该怎么办?
  15. html absolute溢出,position:absolute用法(隐藏溢出部分)
  16. von-ui组件库文档
  17. Ubuntu16.04 安装LSD-SLAM
  18. RESLAM/ REVO 编译 实时RGBD基于边缘的slam系统
  19. 【PaddleHub模型贡献】一行代码实现水表的数字表盘分割
  20. 百度云虚拟机访问项目404

热门文章

  1. react json转换_Typescript + React 新手篇
  2. Java Scanner next()方法与示例
  3. 插入排序算法 ,递归实现_C程序实现递归插入排序
  4. Java DataInputStream readUnsignedByte()方法(带示例)
  5. 2020知道python语言应用答案_2020知到Python语言应用答案章节期末答案
  6. python爬取js动态网页_Python 爬取网页中JavaScript动态添加的内容(一)
  7. linux .net 控制台应用程序,VisualStudioCode创建的asp.net core控制台程序部署到linux
  8. 项目如何用jetty运行_如何用Cloudbase Framework部署一个Vue项目?
  9. plsql查询乱码问题解决
  10. 自学C语言能到达怎样的高度?