自从使用AspectJ风格切面配置,使得Spring的切面配置大大简化,但是AspectJ是另外一个开源项目,其规则表达式的语法也稍稍有些怪异。
下面给出一些常见示例的写法:
比如,下面是一个对Service包上所有方法的切面配置
<aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* *..service*..*(..))"/>
<aop:advisor pointcut-ref="serviceOperation"
advice-ref="txAdvice"/>
</aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* *..service*..*(..))"/>
<aop:advisor pointcut-ref="serviceOperation"
advice-ref="txAdvice"/>
</aop:config>
表达式所处位置如上pointcut的位置。
配置这个为了更好控制切面上的事务,下面是一个事物配置的简单例子:
<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>
<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
切入点指示符。执行表达式的格式如下:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外, 所有的部分都是可选的。返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是
*
,它代表了匹配任意的返回类型。 一个全限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用*
通配符作为所有或者部分命名模式。 参数模式稍微有点复杂:()
匹配了一个不接受任何参数的方法, 而(..)
匹配了一个接受任意数量参数的方法(零或者更多)。 模式(*)
匹配了一个接受一个任何类型的参数的方法。 模式(*,String)
匹配了一个接受两个参数的方法,第一个可以是任意类型, 第二个则必须是String类型。更多的信息请参阅AspectJ编程指南中 语言语义的部分。下面给出一些通用切入点表达式的例子。
-
任意公共方法的执行:
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'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得代理对象在通知体内可用。 -
实现
AccountService
接口的目标对象的任意连接点 (在Spring AOP中只是方法执行):target(com.xyz.service.AccountService)
'target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得目标对象在通知体内可用。 -
任何一个只接受一个参数,并且运行时所传入的参数是
Serializable
接口的连接点(在Spring AOP中只是方法执行)args(java.io.Serializable)
'args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得方法参数在通知体内可用。请注意在例子中给出的切入点不同于execution(* *(java.io.Serializable))
: args版本只有在动态运行时候传入参数是Serializable时才匹配,而execution版本在方法签名中声明只有一个Serializable
类型的参数时候匹配。 -
目标对象中有一个
@Transactional
注解的任意连接点 (在Spring AOP中只是方法执行)@target(org.springframework.transaction.annotation.Transactional)
'@target'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 -
任何一个目标对象声明的类型有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行):@within(org.springframework.transaction.annotation.Transactional)
'@within'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 -
任何一个执行的方法有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行)@annotation(org.springframework.transaction.annotation.Transactional)
'@annotation'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 -
任何一个只接受一个参数,并且运行时所传入的参数类型具有
@Classified
注解的连接点(在Spring AOP中只是方法执行)@args(com.xyz.security.Classified)
'@args'在绑定表单中更加常用:- 请参见后面的通知一节中了解如何使得注解对象在通知体内可用。 -
任何一个在名为'
tradeService
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):bean(tradeService)
-
任何一个在名字匹配通配符表达式'
*Service
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):bean(*Service)
相关推荐
下面将详细解释Spring框架中切入点表达式的常用写法。 1. **execution()指示符**: - `execution()`是Spring中最常用的切入点指示符,用于匹配方法执行。 - 语法结构:`execution(modifiers-pattern? ret-type-...
使用mindmaster打开
在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...
切入点表达式是面向切面编程(AOP)中不可或缺的一部分,尤其在AspectJ和Spring框架中,用于精确地定义何时及何处应用切面。本文将深入探讨AspectJ的切入点表达式,包括其语法结构和常见用法。 切入点表达式的核心...
下面我们将详细探讨Spring切入点表达式配置的过程以及相关标签的使用。 1. **** 标签: 这个标签是Spring AOP配置的根元素,用于声明AOP的相关配置。在`<aop:config>`中,我们可以定义多个切面、切入点和通知,以...
标题中的“Spring Quartz 表达式在线生成器”是指一个工具,它可以帮助开发者方便地创建和测试Spring集成Quartz库时所需的定时任务表达式。Quartz是一个强大的、完全开源的作业调度框架,常用于Java应用中执行定时...
在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点
在Spring AOP中,SpEL可用于定义切面的切入点表达式,如`execution(* com.example.service.*.*(..))`,匹配com.example.service包下所有类的所有方法。 9. **SpEL表达式在Bean初始化和销毁中的应用** Bean的初始...
- 第8章 深入使用Spring- 8.4.5 基于注解的 零配置 方式8.4.5 基于注解的 零配置 方式 10. 组合切入点表达式Spring支持使用如下三
spring定时器关于表达式的说明
**Spring SpEL(Spring Expression Language)表达式详解** Spring Expression Language,简称SpEL,是Spring框架中的一个强大表达式语言,用于在运行时查询和操作对象图。它提供了丰富的表达式语法,支持属性访问...
SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 ...2.6.2 切入点表达式写法 2.6.3 在service层实现类UserServiceImpl的addUser()方法
SpEL 在 Spring 的许多核心功能中扮演着关键角色,如 Bean 的装配、AOP(面向切面编程)的切入点定义等。 **1. SpEL 基本概念** - **表达式**: SpEL 支持多种类型的表达式,如属性访问、方法调用、算术运算、比较...
下面是一些常用的切入点表达式: 1. `execution(* com.example.service.*.*(..))`:这个表达式匹配com.example.service包下的所有类的所有公共方法。 2. `@within(com.example.aspect.MyAspect)`:匹配被`@MyAspect...
在Spring框架中,定时任务是通过`@Scheduled`注解和`TaskScheduler`接口实现的,其中`cron`表达式是用于定义定时规则的核心部分。本文将深入探讨Spring的定时器以及如何生成和理解`cron`表达式。 一、Spring定时...
### Spring表达式语言(SpEL)详解 #### 引言 Spring框架自3.0版本引入了一种全新的配置对象依赖注入的方式—Spring表达式语言(SpEL),这为开发人员提供了一个灵活且强大的工具,使得在配置文件或注解中进行复杂的...
10. **SpEL在AOP中的应用**:在Spring AOP中,SpEL常用于定义切入点表达式,允许基于方法参数、返回值甚至执行时的上下文来决定拦截哪些方法。 在Spring 3.0.2 API文档中,你可以找到关于SpEL的详细说明,包括每个...
### Spring 表达式语言 (SpEL) 中文参考手册概览 #### 一、Spring SpEL 概念与用途 Spring SpEL(Spring Expression Language)是一种强大的表达式语言,用于处理运行时查询和操作对象图。SpEL 的设计目标是提供一...
这个是关于Spring调度器的使用 里面详细介绍了各个时间的表达式,有需要可以下载。
理解Quartz表达式的关键点: - **Cron表达式**:由7个子表达式组成,分别代表秒、分、时、日、月、周和年。每个子表达式可以是一个具体值、通配符(*)、范围、列表或组合。 - **SimpleTrigger**:适用于按固定...