`

Spring切入点表达式常用写法

 
阅读更多
Spring切入点表达式常用写法
 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 框架中切入点 pointcut 表达式的常用写法

    下面将详细解释Spring框架中切入点表达式的常用写法。 1. **execution()指示符**: - `execution()`是Spring中最常用的切入点指示符,用于匹配方法执行。 - 语法结构:`execution(modifiers-pattern? ret-type-...

    spring的AOP和AOP相关概念切入点表达式写法详细说明.emmx

    使用mindmaster打开

    springaop中切入点表达式完整示例代码

    在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...

    切入点表达式

    切入点表达式是面向切面编程(AOP)中不可或缺的一部分,尤其在AspectJ和Spring框架中,用于精确地定义何时及何处应用切面。本文将深入探讨AspectJ的切入点表达式,包括其语法结构和常见用法。 切入点表达式的核心...

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

    下面我们将详细探讨Spring切入点表达式配置的过程以及相关标签的使用。 1. **** 标签: 这个标签是Spring AOP配置的根元素,用于声明AOP的相关配置。在`&lt;aop:config&gt;`中,我们可以定义多个切面、切入点和通知,以...

    spring quartz 表达式在线生成器

    标题中的“Spring Quartz 表达式在线生成器”是指一个工具,它可以帮助开发者方便地创建和测试Spring集成Quartz库时所需的定时任务表达式。Quartz是一个强大的、完全开源的作业调度框架,常用于Java应用中执行定时...

    execution表达式&切入点表达式.txt

    在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点

    Spring_SpEl表达式使用用例

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

    spring定时器关于表达式的说明

    spring定时器关于表达式的说明

    spring spEL 表达式详解

    **Spring SpEL(Spring Expression Language)表达式详解** Spring Expression Language,简称SpEL,是Spring框架中的一个强大表达式语言,用于在运行时查询和操作对象图。它提供了丰富的表达式语法,支持属性访问...

    SpringBoot下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 ...2.6.2 切入点表达式写法 2.6.3 在service层实现类UserServiceImpl的addUser()方法

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

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

    Java EE,Spring基础及应用-切入点(Pointcut)

    下面是一些常用的切入点表达式: 1. `execution(* com.example.service.*.*(..))`:这个表达式匹配com.example.service包下的所有类的所有公共方法。 2. `@within(com.example.aspect.MyAspect)`:匹配被`@MyAspect...

    spring 定时器cron表达式生成

    在Spring框架中,定时任务是通过`@Scheduled`注解和`TaskScheduler`接口实现的,其中`cron`表达式是用于定义定时规则的核心部分。本文将深入探讨Spring的定时器以及如何生成和理解`cron`表达式。 一、Spring定时...

    Spring表达式语言.pdf

    ### Spring表达式语言(SpEL)详解 #### 引言 Spring框架自3.0版本引入了一种全新的配置对象依赖注入的方式—Spring表达式语言(SpEL),这为开发人员提供了一个灵活且强大的工具,使得在配置文件或注解中进行复杂的...

    spring3.0.2api 文档spring表达式语言

    10. **SpEL在AOP中的应用**:在Spring AOP中,SpEL常用于定义切入点表达式,允许基于方法参数、返回值甚至执行时的上下文来决定拦截哪些方法。 在Spring 3.0.2 API文档中,你可以找到关于SpEL的详细说明,包括每个...

    Spring表达式语言中文参考手册.docx

    ### Spring 表达式语言 (SpEL) 中文参考手册概览 #### 一、Spring SpEL 概念与用途 Spring SpEL(Spring Expression Language)是一种强大的表达式语言,用于处理运行时查询和操作对象图。SpEL 的设计目标是提供一...

    Spring调度器corn表达式

    这个是关于Spring调度器的使用 里面详细介绍了各个时间的表达式,有需要可以下载。

    spring quartz 表达式生成器 网页版

    理解Quartz表达式的关键点: - **Cron表达式**:由7个子表达式组成,分别代表秒、分、时、日、月、周和年。每个子表达式可以是一个具体值、通配符(*)、范围、列表或组合。 - **SimpleTrigger**:适用于按固定...

    xJavaFxTool-spring-正则表达式

    JavaFxSpringBootCronHostsCmdPdfEmail******Zookeeper 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式

Global site tag (gtag.js) - Google Analytics