Spring之AOP系列--指示器
原文网址:Spring之AOP系列--指示器_IT利刃出鞘的博客-CSDN博客
简介
说明
本文介绍Spring(SpringBoot)的AOP的指示器的使用。
这些指示器可以用在@Around,@Before等括号内,指定切点。
官网
10.2. @AspectJ support - Spring 中文文档
Pointcuts(aspectj官网)
切入点指定者
指示器大全
切入点指定者:pointcut designators(pcd)
AspectJ指示器 |
描述 |
arg() |
限制连接点匹配参数为指定类型的执行方法 |
@args() |
限制连接点匹配参数由指定注解标注的执行方法 |
execution() |
用于匹配是连接点的执行方法 |
this() |
限制连接点匹配AOP代理的bean引用为指定类型的类 |
target |
限制连接点匹配目标对象为指定类型的类 |
@target() |
限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解 |
within() |
限制连接点匹配指定的类型 |
@within() |
限制连接点匹配指定注解所标注的类型(当时用Spring AOP时,方法定义在由指定的注解所标注的类里) |
@annotation |
限定匹配带有指定注解的连接点 |
bean |
限制连接点匹配的特定命名的 Spring bean。格式:bean(idOrNameOfBean) 这是 Spring 特有的。(对 AspectJ 定义的 PCD 的扩展) |
完整的 AspectJ 切入点语言支持额外的切入点指定者,但是 Spring 不支持这个功能。 他们分别是call, get, set, preinitialization, staticinitialization, initialization, handler, adviceexecution, withincode, cflow, cflowbelow, if, @this, 和 @withincode 。 在 Spring AOP 中使用这些指定者将会导致抛出IllegalArgumentException 异常。
示例
任意 public 方法的执行:
execution(public * *(..))
任何一个以“set”开始的方法的执行:
execution(* set*(..))
AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
定义在service包或者子包里的任意方法的执行:
execution(* com.xyz.service..*.*(..))
在service包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service.*)
在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :
within(com.xyz.service..*)
实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) :
this(com.xyz.service.AccountService)
'this'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。
实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :
target(com.xyz.service.AccountService)
'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内访问到的部分。
任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)
args(java.io.Serializable)
'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知体内访问到的部分。
请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable))只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而 execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。
有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP 中只是方法执行)
@target(org.springframework.transaction.annotation.Transactional)
'@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
列表里任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行)
@within(org.springframework.transaction.annotation.Transactional)
'@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行)
@annotation(org.springframework.transaction.annotation.Transactional)
'@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。
任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行)
@args(com.xyz.security.Classified)
'@args'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得 annotation 对象可以在通知体内访问到的部分。
任何 Spring bean 命名为 tradeService 的切入点(在Spring AOP中只是方法执行):
bean(tradeService)
任何 Spring bean 命名符合正则表达式为 *Service 的切入点(在Spring AOP中只是方法执行):
bean(*Service)
合并切入点表达式
可以使用 &&, || 和 ! 来合并,还可以通过名字来指向切入点表达式。
以下的例子展示了三种切入点表达式:
//代表了任意 public 方法的执行时匹配
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}//在指定包中的任意的方法执行时匹配
@Pointcut("within(com.xyz.someapp.trading..*)")
private void inTrading() {}//指定包任意的公共方法执行时匹配
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}
@Pointcut("execution(* *(..,com.example.a,..)) && " +"(@annotation(org.springframework.web.bind.annotation.RequestMapping) || " +"@annotation(org.springframework.web.bind.annotation.GetMapping) ||" +"@annotation(org.springframework.web.bind.annotation.PostMapping) ||" +"@annotation(org.springframework.web.bind.annotation.PutMapping) ||" +"@annotation(org.springframework.web.bind.annotation.DeleteMapping) ||" +"@annotation(org.springframework.web.bind.annotation.PatchMapping))")
execution
格式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
除了返回类型模式,名字模式和参数模式以外,所有的部分都是可选的。
Spring之AOP系列--指示器相关推荐
- Spring之AOP系列--将方法上的注解做为切点(用@Around)
原文网址:Spring之AOP系列--将方法上的注解做为切点(用@Around)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring(SpringBoot)的AOP的用 ...
- 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator
通过前一篇<死磕Spring AOP系列1:编程式实现AOP>,学习了Spring对代理的底层支持,认识了ProxyFactory对象,及从类设计层面认识了PointCut&Adv ...
- 【SSM框架系列】Spring 的 AOP(面向切面编程)
什么是 AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP 是 OOP ...
- AOP到底有啥魅力?《Spring实战》系列 05
终于来到了 <Spring实战>第一部分的最后一章,"面向切面的Spring",也是Spring第二把宝刀的精髓所在:AOP大法. 还记得AOP是什么吗?-----(A ...
- spring(4)面向切面的Spring(AOP)
[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review "spring(4)面向切面的Spring(AOP) ...
- “Spring入门”教程系列
大家好, 我很高兴向您介绍"Spring入门"教程系列! 这是一系列文章,最初由我们的JCG合作伙伴 Michal Vrtiak在vrtoonjava博客上撰写 . 本系列中将逐步 ...
- Ioc容器beanDefinition-Spring 源码系列(1)
Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...
- 【Spring】AOP - 面向切面
面向切面 - AOP 切面实现了横切关注点(跨越多个应用对象的逻辑)的模块化: 术语 通知(Advice) 在AOP术语中,切面的工作被成为通知.通知定义了切面是什么以及何时使用. Spring切面可 ...
- 【java】通过spring通过AOP实现日志打印(二)
本人菜鸡一个,上一篇文章说了说自己对AOP的理解,并留下了一个用spring注解实现AOP的坑,本文就来填填这个坑 该系列暂时有两篇文章: [java]java中的AOP思想(一):https://b ...
最新文章
- 学术会议,已沦为表演...
- ubuntu-make/makefile/cmake
- css3多行超出隐藏并打点点
- 【转】经济计量学软件包Eviews快速使用
- 解决win7下netbeans安装的错误问题
- php数组循环转为对象,php中循环实现(字符串,对象,或者数组)编码相互转换
- cad在线转换低版本_别再傻瓜式操作了,工作效率上不去?这6个小技巧带你玩转CAD...
- 嵌套DIV中的onClick事件在嵌套容器中的连环作用
- mysql 修改字段为主键自增_给MySQL中某表增加一个新字段,设为主键值为自动增长。...
- 地平线谭洪贺:AI芯片怎么降功耗?从ISSCC2017说起
- 图像的剪裁——imcrop
- matlab中fix函数是啥,fix函数(函数fix是什么意思)
- 地图标识符号大全_起名字大全男孩 男孩名字,起名字大全男孩
- read/write 阻塞/非阻塞
- 星巴克——starbuck
- vue3 provide inject用法
- User-Agent(浏览器标识)应用详解
- 再谈Revit二次开发的可靠性和前景
- 指定IDEA的字符编码
- 南京理工大学电子与通信工程考研上岸经验分享
热门文章
- 使用JavaScript进行进制转换将字符串转换为十进制
- 原创|5分钟建立反脆弱系统
- ORACLE进阶(十)start with connect by 实现递归查询
- 一班洽谈框架细化_健全完善组织架构,明确细化职责分工,快速推进项目进展...
- Evernote和有道云笔记的比较
- 通过文件url地址获取base64;通过图片url地址获取base64;js获取文件的base64
- 安卓商城购物车布局案例
- 阿里巴巴分布式数据库服务DRDS
- win7系统解决耳机插口的问题
- kernel 3.10代码分析--KVM相关--虚拟机运行