SpringAop @Pointcut(“@annotation“)\@Aspect练习
切面记录日志
切面类
@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练习相关推荐
- SpringAOP @PointCut 切点解析
前言 进行Spring AOP编程,首先要声明一个切面,里面包含连接点和通知.然后把连接点作用到通知上面去,通知方法内部就是通知的逻辑.这个流程已经在博客[详解什么是Spring AOP]中给出过,而 ...
- SpringAOP中@annotation和@within的作用
@annotation和@within的区别: @annotation 方法级别@within 对象级别@Pointcut("@annotation(com.ruoyi.common.ann ...
- IDEA配置+Spring框架
1. IDEA环境配置 ctrl+F12查看方法结构 ctrl+H 查看类图 ctrl+D向下复制一行 Alt+Insert 提供构造/get/set/to String Ctel+Alt+T 选中代 ...
- 【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)
文章目录 前言 AOP与Spring AOP @Aspect简单案例快速入门 一.@Pointcut @annotation 二.五种通知Advice 1. @Before前置通知 2. @After ...
- [Done]Spring @Pointcut 切点调用不到(SpringAOP嵌套方法不起作用) 注意事项
今天在开发过程中,遇到一个问题卡了很久,测试代码如下: package spring.pointcut;import org.aspectj.lang.ProceedingJoinPoint; imp ...
- Spring-AOP @AspectJ切点函数之@annotation()
文章目录 @annotation()概述 实例 @annotation()概述 @annotation表示标注了某个注解的所有方法. 下面通过一个实例说明@annotation()的用法. Annot ...
- Spring AOP详解一文搞懂@Aspect、@Pointcut、@Before、@Around、@After、@AfterReturning、@AfterThrowing
文章目录 1.AOP是什么 2.AOP中注解的含义 3.Pointcut切入点的语法 4.AOP代码实现 1.AOP是什么 AOP:Aspect Oriented Programming,翻译过来就是 ...
- @Aspect中@Pointcut 12种用法
本文主要内容:掌握@Pointcut的12种用法. Aop相关阅读 阅读本文之前,需要先掌握下面3篇文章内容,不然会比较吃力. Spring系列第15篇:代理详解(java动态代理&CGLIB ...
- Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration
Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration Spring Framework是基于两 ...
最新文章
- matlab从入门到精通-常用的几种缺失值处理方法
- 《大规模web服务开发技术》阅读笔记
- layout布局_Android ConstraintLayout 降低布局层次,布局优化首选
- java虚拟机手机下载_java虚拟机下载
- 不被重视的基础,高效地使用ADO.net连接对象
- 虚拟机安装 xp步骤(参照百度文库)
- pc端rem适配_自适应PC端网页制作使用REM
- 6.Exchanger-交换机
- 关于智能制造的思考——以中航工业为例
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_38、源码编译安装Redis4.x...
- linux精简版远程登录,Linux下定制SSH来简化远程访问的方法
- 当浏览器是ie11以前版本的,跳转到ie升级页
- 学校做计算机教室锐捷,锐捷网络云课堂:让学生爱上每一节课
- 眼睛干涩胀痛:得了干眼症该怎么办?
- html absolute溢出,position:absolute用法(隐藏溢出部分)
- von-ui组件库文档
- Ubuntu16.04 安装LSD-SLAM
- RESLAM/ REVO 编译 实时RGBD基于边缘的slam系统
- 【PaddleHub模型贡献】一行代码实现水表的数字表盘分割
- 百度云虚拟机访问项目404
热门文章
- react json转换_Typescript + React 新手篇
- Java Scanner next()方法与示例
- 插入排序算法 ,递归实现_C程序实现递归插入排序
- Java DataInputStream readUnsignedByte()方法(带示例)
- 2020知道python语言应用答案_2020知到Python语言应用答案章节期末答案
- python爬取js动态网页_Python 爬取网页中JavaScript动态添加的内容(一)
- linux .net 控制台应用程序,VisualStudioCode创建的asp.net core控制台程序部署到linux
- 项目如何用jetty运行_如何用Cloudbase Framework部署一个Vue项目?
- plsql查询乱码问题解决
- 自学C语言能到达怎样的高度?