`
chenyuguxing
  • 浏览: 40102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring 切面表达式语法

 
阅读更多
自从使用AspectJ风格切面配置,使得Spring的切面配置大大简化,但是AspectJ是另外一个开源项目,其规则表达式的语法也稍稍有些怪异。

下面给出一些常见示例的写法:

比如,下面是一个对Service包上所有方法的切面配置
<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>

通过切面、通知的配置,就为所有的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切面AOP所使用的jar包

    Spring AOP的切入点表达式语法相对较简单,而AspectJ的切入点表达式更强大且灵活。 5. **使用步骤**: - 配置Spring AOP:在Spring配置文件中启用AOP支持,并配置切入点表达式。 - 定义切面:创建一个类作为切面...

    Spring AOP面向切面三种实现

    AspectJ提供了更丰富的语法,如`@Before`、`@After`、`@Around`等,使得切面的定义更加直观。 3. **注解驱动的切面** Spring 2.5以后,引入了注解驱动的AOP,这极大地简化了切面的定义和使用。开发者可以在方法上...

    Spring_SpEl表达式使用用例

    在Spring AOP中,SpEL可用于定义切面的切入点表达式,如`execution(* com.example.service.*.*(..))`,匹配com.example.service包下所有类的所有方法。 9. **SpEL表达式在Bean初始化和销毁中的应用** Bean的初始...

    spring spEL 表达式详解

    在Spring框架中,SpEL被广泛应用于配置文件、注解以及AOP(面向切面编程)中,使得动态数据绑定和复杂逻辑判断变得简单易行。下面我们将深入探讨SpEL的主要特性和用法。 1. **基础语法** - 属性访问:`#{T...

    Spring开发手册_表达式语言_API中文版

    SpEL 在 Spring 的许多核心功能中扮演着关键角色,如 Bean 的装配、AOP(面向切面编程)的切入点定义等。 **1. SpEL 基本概念** - **表达式**: SpEL 支持多种类型的表达式,如属性访问、方法调用、算术运算、比较...

    详解Spring 框架中切入点 pointcut 表达式的常用写法

    在Spring框架中,切入点(pointcut)表达式是AOP(面向切面编程)的核心组成部分,用于定义关注点的精确位置,比如哪些方法应该被拦截。切入点表达式是基于AspectJ语法的,允许开发者精确地指定要拦截的方法。下面将详细...

    Struts2,Spring,MySql,正则表达式等各类API帮助文档

    Spring还支持事务管理、数据访问集成、AOP切面编程,以及与各种ORM框架如Hibernate、MyBatis的集成。 MySql是一款流行的开源关系型数据库管理系统,广泛应用于Web应用程序。它支持SQL标准,具有高性能、高可靠性和...

    aop切面拦截单个方法实例

    自Spring 2.5起,Spring引入了基于注解的AOP,这使得在代码中直接定义切面变得简单。开发者可以使用`@Aspect`注解定义一个切面类,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`注解来定义...

    在自定义spring aop中使用el获取拦截方法的变量值。

    这通常涉及到Spring的代理机制、AOP的切面定义、方法调用上下文以及EL的语法和功能。 Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被...

    spring xml 实现aop切面编程

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。本篇文章将详细讲解如何通过XML配置实现Spring AOP的切面编程,帮助初学者理解这一核心特性。 首先,我们要...

    spring aop切面编程需要aspectjweaver-1.5.3.jar aspectj-1.9.6.jar aspectjrt-1.7.4.jar

    在Spring AOP(面向切面编程)中,AspectJ是一个重要的扩展工具,它允许开发者以声明式的方式实现切面,增强了Spring框架的功能。在提供的文件列表中,我们看到`aspectjweaver-1.5.3.jar`, `aspectj-1.9.6.jar`, 和 ...

    基于IDEA的SSH项目之四:简单的切面应用---程序包

    这可以通过使用Spring表达式语言(SpEL)或者AspectJ语法来实现。 5. **通知(Advice)**:通知是在切点匹配到的方法执行前后执行的代码片段。Spring支持多种类型的通知,包括前置通知(before)、后置通知(after...

    Java 和 Kotlin的注解以及切面实现方式

    - **Spring AOP**:通过定义切面(Aspect),声明通知(Advice),以及指定切入点(Pointcut)来实现AOP。例如: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*...

    Spring切入点表达式配置过程图解

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过插入切面来增强或监控程序的行为。切入点表达式是AOP的核心概念,用于精确地定义通知(advice)应该在何时何地...

    关于AOP切面的demo

    AspectJ通过扩展Java语法,引入了切面(Aspect)、通知(Advice)、切点(Pointcut)等概念,使得开发者可以方便地定义和实现切面。 在**AOP切面**中,一个切面通常包含了多个通知,这些通知会在特定的切点上执行。...

    有关java切面和通知

    在Spring中,切面可以通过通用类(基于模式的风格)或带有@Aspect注解的普通类(@AspectJ风格)来实现。例如,事务管理就是一个常见的切面,它横切多个业务操作。 **连接点(Joinpoint)**是程序执行过程中的特定点...

    AOP面向切面详解

    面向切面编程(AOP)是Spring框架中的一个重要特性,它允许程序员定义“切面”,这些切面可以插入到应用程序的多个点,以实现关注点的分离。在传统的面向对象编程中,我们通常将业务逻辑与日志记录、事务管理等横切...

    面向切面编程PPT(Java语言)

    面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将横切关注点(如日志、事务管理和安全性)从核心业务逻辑中分离出来,以提高代码的可读性和可维护性。Java语言中的AOP是通过Spring框架等库...

    Spring-Aop所有jar

    切入点表达式使用一种类似于正则表达式的语法,可以精确地定位到需要插入切面的方法。 Spring Aop-4.0.0.RELEASE版本是Spring 4.0系列的一个发行版,包含了对AOP特性的支持和改进。在这个版本中,你可以期待以下...

Global site tag (gtag.js) - Google Analytics