- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解Spring 框架中切入点 pointcut 表达式的常用写法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
自从使用 AspectJ 风格切面配置,使得 spring 的切面配置大大简化,但是 AspectJ 是另外一个开源项目,其规则表达式的语法也稍稍有些怪异.
下面给出一些常见示例的写法,例如,下面是一个对 Service 包上所有方法的切面配置:
1
2
3
4
|
<
aop:config
>
<
aop:pointcut
id
=
"serviceOperation"
expression
=
"execution(* *..service*..*(..))"
/>
<
aop:advisor
pointcut-ref
=
"serviceOperation"
advice-ref
=
"txAdvice"
/>
</
aop:config
>
|
表达式所处位置如上pointcut的位置。配置这个是为了更好控制切面上的事务,下面是一个事物配置的简单例子:
1
2
3
4
5
6
7
8
|
<
tx:advice
id
=
"txAdvice"
transaction-manager
=
"transactionManager"
>
<
tx:attributes
>
<
tx:method
name
=
"delete*"
rollback-for
=
"Exception"
/>
<
tx:method
name
=
"save*"
rollback-for
=
"Exception"
/>
<
tx:method
name
=
"update*"
rollback-for
=
"Exception"
/>
<
tx:method
name
=
"*"
read-only
=
"true"
rollback-for
=
"Exception"
/>
</
tx:attributes
>
</
tx:advice
>
|
通过切面、通知的配置,就为所有的以delete、save和update开头的方法添加上了一致性事务,对其他方法添加上了只读事务.
这个还不够细,如果要写更为详细的控制,就需要研究 AspectJ 切点配置的语法了,其实研究这些标准,还不如拿几个例子看看,解决实际问题就行了。就像写正则表达式一样,标准明摆着,要写好却不容易,从例子着手就能快速上手和领悟.
以下文档来自 Spring 中文开发指南 2.5 文档,由满江红开源组织翻译:
Spring AOP 用户可能会经常使用 execution 切入点指示符。执行表达式的格式如下:
1
2
3
|
execution(modifiers-pattern?
ret-type-pattern declaring-type-pattern?
name-pattern(param-pattern)
throws
-pattern?)
|
除了返回类型模式(上面代码片断中的 ret-type-pattern),名字模式和参数模式以外, 所有的部分都是可选的。返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是*,它代表了匹配任意的返回类型。 一个全限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。你可以使用*通配符作为所有或者部分命名模式。 参数模式稍微有点复杂,()匹配了一个不接受任何参数的方法, 而(..)则匹配了一个接受任意数量参数的方法(零或者更多)。模式(*)匹配了一个接受一个任何类型的参数的方法。 模式(*,String)匹配了一个接受两个参数的方法,第一个可以是任意类型, 第二个则必须是 String 类型。更多的信息请参阅 AspectJ 编程指南中 语言语义的部分。下面给出一些通用切入点表达式的例子.
任意公共方法的执行:
1
|
execution(
public
* *(..))
|
任何一个名字以 set 开始的方法的执行:
1
|
execution(* set*(..))
|
AccountService 接口定义的任意方法的执行:
1
|
execution(* com.xyz.service.AccountService.*(..))
|
在 service 包中定义的任意方法的执行:
1
|
execution(* com.xyz.service.*.*(..))
|
在 service 包或其子包中定义的任意方法的执行:
1
|
execution(* com.xyz.service..*.*(..))
|
在 service 包中的任意连接点(在 Spring AOP 中只是方法执行):
1
|
within(com.xyz.service.*)
|
在 service 包或其子包中的任意连接点(在 Spring AOP 中只是方法执行):
1
|
within(com.xyz.service..*)
|
实现 AccountService 接口的代理对象的任意连接点 (在 Spring AOP 中只是方法执行):
1
|
this
(com.xyz.service.AccountService)
|
实现 AccountService 接口的目标对象的任意连接点 (在 Spring AOP 中只是方法执行):
1
|
target(com.xyz.service.AccountService)
|
任何一个只接受一个参数,并且运行时所传入的参数是 Serializable 接口的连接点(在 Spring AOP 中只是方法执行):
1
|
args(java.io.Serializable)
|
请注意在例子中给出的切入点不同于execution(* *(Java.io.Serializable)),args 版本只有在动态运行时候传入参数是 Serializable 时才匹配,而 execution 版本在方法签名中声明只有一个 Serializable 类型的参数时候匹配.
目标对象中有一个 @Transactional 注解的任意连接点 (在 Spring AOP 中只是方法执行):
1
|
@target
(org.springframework.transaction.annotation.Transactional)
|
任何一个目标对象声明的类型有一个 @Transactional 注解的连接点 (在 Spring AOP 中只是方法执行):
1
|
@within
(org.springframework.transaction.annotation.Transactional)
|
任何一个执行的方法有一个 @Transactional 注解的连接点 (在 Spring AOP 中只是方法执行):
1
|
@annotation
(org.springframework.transaction.annotation.Transactional)
|
任何一个只接受一个参数,并且运行时所传入的参数类型具有 @Classified 注解的连接点(在 Spring AOP 中只是方法执行):
1
|
@args
(com.xyz.security.Classified)
|
任何一个在名为 tradeService 的 Spring bean 之上的连接点 (在 Spring AOP 中只是方法执行):
1
|
bean(tradeService)
|
任何一个在名字匹配通配符表达式*Service的 Spring bean 之上的连接点 (在 Spring AOP 中只是方法执行):
1
|
bean(*Service)
|
其中,this、tagart、args、 @target、 @with、 @annotation和@args在绑定表单中更加常用.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/qq_35246620/article/details/68942609 。
最后此篇关于详解Spring 框架中切入点 pointcut 表达式的常用写法的文章就讲到这里了,如果你想了解更多关于详解Spring 框架中切入点 pointcut 表达式的常用写法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 aspectj 来拦截用 @Profile(description="something") 注释的方法 @Retention(RetentionPolicy.RUNTIME) @Targ
我对 Spring AOP 中的所有类都有一个切入点,例如 @Pointcut("执行(* com.company.app..*(..))") 现在我需要排除一个类 com.company.app.I
我对 Spring AOP 中的所有类都有一个切入点,例如 @Pointcut("执行(* com.company.app..*(..))") 现在我需要排除一个类 com.company.app.I
我想知道以下内容在切入点中意味着什么 after(FigureElement fe, int x, int y) returning: call(void FigureElement.
在开始之前,我想澄清一下,我目前对 AOP 术语的理解如下...... 方面是 AOP 等同于 OOP 中的类。 通知是 AOP 等价于 OOP 中的方法。 切入点是 AOP 等价于 OOP 中的“使
我将参与 android 设备驱动程序的开发。在准备过程中,我想掌握基础知识并为此提高我的技能。 过去 2 年我一直在使用 VB 和 JAVA,所以我对自己的 C 编程没有信心。 Linux 设备驱动
我想记录类列表(可能属于不同的包)中所有方法的条目。请注意,这些方法应该只属于指定的类。 我试过以下方法,但这些都不起作用 (1) 使用 if() 切入点这里报错 "incompatible numb
我正在使用 @AspectJ 样式来编写方面,以处理我们应用程序中的日志记录。基本上我有一个像这样设置的切入点: @Pointcut("call(public * com.example..*(..)
例如我有以下方法: public void method1(@MyAnnotation Object a, Object b..) { ... } public void method1(Obj
我正在寻找一种围绕类级别变量指定切入点的方法。像这样的东西: @Target(ElementType.METHOD) @Retention(RetentionPolicy.FIELD) @interf
如何编写一个切入点来触发方法,例如MyClass 上的所有 setter 都被执行,但该方法缺少一些特定的注释,例如@Ann1 和 @Ann2 最佳答案 import java.lang.annota
我在让各个方面正常工作时遇到一些问题。由于某种原因,它们似乎只有在我真正了解该方面的应用位置时才起作用。在四个切入点/建议中,只有最后一个匹配并输出任何内容。我在这里缺少什么? public aspe
我是 Spring AOP 触发器的新手。我的代码中有以下切入点触发器。当定义了所有四个切入点时,只有第一个切入点触发器 (com.src.a()) 正在工作,下面的其余切入点不会触发。但是当我在四个
使用加载时编织,纯 AspectJ。 我们有 2 个注释 @Time 和 @Count,以及一些带注释的方法。 @Time (name="myMethod1Time") @Count (name="m
这个问题已经有答案了: Java Aspect returned value to be used in the method (1 个回答) 已关闭 6 年前。 我想要 AOP 记录方法的返回值
我正在尝试围绕使用自定义注释注释的方法定义切入点。注释有一个参数,我想在切入点定义中包含一个检查。 这是注释: public @interface MyAnno { String[] types;
我正在使用 Spring AOP 进行日志记录。我想创建一个适用于除具有特定注释的方法之外的所有方法的切入点,但我不知道如何去做。我所发现的只是如何包含带有注释的方法。 最佳答案 示例注释: pack
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..)) This pointcut, named services
我需要使用 AspectJ 向每个初始化对象注入(inject)一些方法。 我想用这个: pointcut vistaInjection(Object o) : initialization(
假设我有这样的方法: public void method(@CustomAnnotation("value") String argument) 是否有一个切入点表达式可以选择所有带有 @Custo
我是一名优秀的程序员,十分优秀!