spring aop execution表达式的用法

1.切所有controller下的请求

项目结构

任意公共方法的执行:

execution(public * (…))

##public可以省略, 第一个 代表方法的任意返回值 第二个参数代表任意包+类+方法 (…)任意参数

配置切入点:

@Pointcut("execution(* com.gcol.qy.web.system.controller..*.*(..))")
public void conPoint(){}

表达式结构解释如下:

标识符 含义
execution() 表达式的主体
第一个“ * ”符号 表示返回值的类型任意
com.gcol.qy.web.system.controller AOP所切的服务的包名,即,需要进行横切的业务类
包名后面的“..” 表示当前包及子包
第二个“*” 表示类名,*即所有类
.*(..) 表示任何方法名,括号表示参数,两个点表示任何参数类型

如果需要多个切入点可以用 || 符号 如下:

@Pointcut("execution(* com.gcol.qy.web.system.controller..*.*(..)) || execution(* com.gcol.qy.web.system.api..*.*(..))")
public void conPoint(){}

xml 配置

 <!-- 切换到获取kpi信息的oracle数据库 -->
 <aop:config>
  <aop:aspect id="dataSourceAspect2" ref="dataSourceInterceptor">
   <aop:pointcut id="daoThree" expression="execution(* com.gcol.qy.web.system.service.kpi.KpiServiceImpl.*(..))
   || execution(*  com.gcol.qy.web.system.service.team.TeamServiceImpl.getFamilyPremiun(..))
   || execution(*  com.gcol.qy.web.system.service.team.TeamServiceImpl.getSalesmanPremium(..))"/>
   <aop:before pointcut-ref="daoThree" method="setDataSourceKpi"/>
  </aop:aspect>
 </aop:config>

ref=“dataSourceInterceptor” 执行的方法类。

Spring中execution语法

语法格式

execution(修饰符 返回类型 切入点类 切入点方法(参数) 异常抛出)

  • 修饰符: 可选,支持通配符,(public/private/protected)
  • 返回类型: 必填,支持通配符,可以使用 * 来匹配所有的返回值类型
  • 切入点类: 可选,支持通配符,指定切入点类
  • 切入点方法: 必填,支持通配符,指定要匹配的方法名,可以使用"*"通配符来匹配所有方法
  • 参数: 若无可不填,指定方法声明中的形参列表,支持两个通配符,即*和…

其中*代表一个任意类型的参数,而…代表零个或多个任意类型的参数

  • () 匹配一个不接受任何参数的方法
  • (…) 匹配一个接受任意数量参数的方法,可以是零个或多个
  • (*) 匹配一个接受一个任何类型的参数的方法,只能是一个
  • (*,String) 匹配一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是String类型

异常抛出: 可选,支持通配符,指定方法声明抛出的异常

常用实例

<!-- 【1、拦截所有public方法】 -->
<aop:pointcut expression="execution(public * *(..))" id="pt"/>  

<!-- 【2、拦截所有save开头的方法】 -->
<aop:pointcut expression="execution(* save*(..))" id="pt"/> 

<!-- 【3、拦截指定类的指定方法, 拦截时候一定要定位到方法】 -->
<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.save(..))" id="pt"/>

<!-- 【4、拦截指定类的所有方法】 -->
<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.*(..))" id="pt"/>

<!-- 【5、拦截指定包,以及其自包下所有类的所有方法】 -->
<aop:pointcut expression="execution(* com..*.*(..))" id="pt"/>

<!-- 【6、多条件】 -->
<!-- 或:||   or -->
<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.save(..)) || execution(* com.shore.dao.impl.MessageDao.save(..))" id="pt" />

<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.save(..)) or execution(* com.shore.dao.impl.MessageDao.save(..))" id="pt" />

<!-- 且:&&   and -->  <!-- 语法虽然没错,但,没意义 -->
<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.save(..)) && execution(* com.shore.dao.impl.MessageDao.save(..))" id="pt" />

<aop:pointcut expression="execution(* com.shore.dao.impl.UserDao.save(..)) and execution(* com.shore.dao.impl.MessageDao.save(..))" id="pt" />

<!-- 【7、取非值:not  !  不拦截指定的规则,拦截除此之外的所有类的方法】 -->
<aop:pointcut expression="!execution(* com.shore.dao.impl.UserDao.save(..))" id="pt"/> <!-- 注意not前必须有空格 -->

<aop:pointcut expression=" not execution(* com.shore.dao.impl.UserDao.save(..))" id="pt"/>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring的@Scheduled 如何动态更新cron表达式

    常见的本地定时写法如下: @Scheduled(cron = "0/5 * * * * ?") private void test() { log.info("业务处理逻辑...5秒一次"); } 如果想要动态更新cron表达式,可以这样写: 先写一个类,让cron表达式总是读成员变量的值. 再写一个controller,通过调用set方法就可以动态设置这个cron表达式了 @Lazy(false) @Component @EnableScheduling publ

  • Spring实战之Bean定义中的SpEL表达式语言支持操作示例

    本文实例讲述了Spring实战之Bean定义中的SpEL表达式语言支持操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <!-- 指定Spring配置文件的根元素和Schema 导入p:命名空间和util:命名空间的元素 --> <beans xmlns="http://www.springframework.org/schema/beans"

  • Spring实战之使用Expression接口进行表达式求值操作示例

    本文实例讲述了Spring使用Expression接口进行表达式求值操作.分享给大家供大家参考,具体如下: 一 Bean package org.crazyit.app.domain; import java.util.Date; public class Person { private Integer id; private String name; private Date birth; // 无参数的构造器 public Person() { } // 初始化全部成员变量的构造器 pub

  • Spring AOP中使用args表达式的方法示例

    本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml

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

    常用标签: 1. <aop:config> 作用:声明aop配置 2. <aop:pointcut> 作用:配置切入点表达式 属性:id:唯一标识切入点表达式名称 expression:定义切入点表达式 3. <aop:aspect> 作用:配置切面 属性:id:唯一标识切面的名称 ref:引用切面类(通知类)bean的id 4. <aop:before> 作用:配置前置通知(在执行目标对象方法之前执行) 属性:method:指定通知方法名称 pointcu

  • 使用Spring安全表达式控制系统功能访问权限问题

    一.SPEL表达式权限控制 从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限.Spring Security可用表达式对象的基类是SecurityExpressionRoot. 表达式函数 描述 hasRole([role]) 用户拥有指定的角色时返回true (Spring security默认会带有ROLE_前缀),去除前缀参考Remove the ROLE_ hasAnyRole([

  • Spring表达式语言SpEL用法详解

    这篇文章主要介绍了spring表达式语言SpEL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 (1)spring表达式语言是一个支持运行时查询和操作对象图得我强大表达式语言. (2)语言类似于EL:SpEL使用#{...}作为定界符.所有在大括号中的字符串均被认为是SpEL. (3)SpEL为bean的属性进行动态赋值提供了便利. (4)通过SpEL可以实现: 通过Bean的id对Bean进行引用 调用方法及引用对象的属性 计算表达式

  • Spring与Shiro整合及加载权限表达式问题

    如何加载权限表达式 我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限: 那么接下来我们就要思考一个问题了,这三张表中的数据要从何而来呢? 用户表 首先先看用户表,用户表的数据库是从用户注册而来: 角色 角色的话肯定是我们手动去创建出来,但是我们在创建角色之前呢?是不是需要先有权限后才能去创建角色呢?因为角色是依赖于权限,只要先有了权限,我们就可以讲它们归类,分配给我们某一个角色: 所以我们的突破口就是,权限该如何去加载这个问题: 我们可以打开我们的Cotroller在接口上可以看到凡

  • spring aop execution表达式的用法

    1.切所有controller下的请求 项目结构 任意公共方法的执行: execution(public * (-)) ##public可以省略, 第一个 代表方法的任意返回值 第二个参数代表任意包+类+方法 (-)任意参数 配置切入点: @Pointcut("execution(* com.gcol.qy.web.system.controller..*.*(..))") public void conPoint(){} 表达式结构解释如下: 标识符 含义 execution() 表

  • Spring AOP 切面@Around注解的用法说明

    @Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务. 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现: 再比如我们想在执行方法时动态修改参数值等 类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器.事务.日志.权限验证等方面. 完整演示代码如下: 需要说明的是,在以下例子中,我们即可以只用@Around注解,并设置条件,

  • 谈谈Spring AOP中@Aspect的高级用法示例

    前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算符 说明 && 与运算. ! 非运算. || 或运算. 2 切点命名 一般情况下,切点是直接声明在需要增强方法处,这种切点的声明方式称为匿名切点,匿名切点只能在声明处被使用 . 如果希望在其它地方可以重用这个切点,我们可以通过 @Pointcut 注解及切面类方法来命名它. public cl

  • Spring AOP里的静态代理和动态代理用法详解

    什么是代理? 为某一个对象创建一个代理对象,程序不直接用原本的对象,而是由创建的代理对象来控制原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间 什么是静态代理? 由程序创建或特定工具自动生成源代码,在程序运行前,代理类的.class文件就已经存在 通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的. 优点

  • spring aop pointcut 添加多个execution方式

    目录 spring aop pointcut 添加多个execution spring aop:pointcut--expression--多个execution连接 spring aop pointcut 添加多个execution spring aop添加多个包,用||或者or隔开 <!-- 只对业务逻辑层实施事务 --> <aop:config expose-proxy="true"> <aop:pointcut expression="e

  • spring aop Pointcut execution规则介绍

    目录 spring aop Pointcut execution规则 切面注解@Pointcut("execution()")写法 spring aop Pointcut execution规则 任意公共方法的执行: execution(public * *(..)) ##public可以省略, 第一个* 代表方法的任意返回值 第二个参数代表任意包+类+方法 (..)任意参数 任何一个以"set"开始的方法的执行: execution(* set*(..)) Use

  • SpringAop切入点execution表达式的深入讲解

    目录 一.Aspect切入点语法定义 二.如何定义多个切入点,在多个表达式之间如何表示 三.execution表达式 五.方法签名表达式 六.其他替代的切入点指示符 七.通配符 总结 一.Aspect切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件形式,还是注解的方式都需要定义pointcut(切入点),pointcut称之为切入点. 例如 : 定义切入点表达式  : execution (* com.sample.service.impl..*.*(..)) 上

  • 图解JAVA中Spring Aop作用

    假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如 但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法.但是这样我们仍然必须手动插入这些方法. 但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改. 通过动态代理,可以在指定位置执行对应流程.这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置 插入这些功能.这样的思想,被称为面向切面编程,亦即AOP. 为了在指定位置执行这些横

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

随机推荐