下面介绍@AspectJ语法基础

一、切点表达式函数

AspectJ的切点表达式由关键字和操作参数组成,如execution(* greetTo(..)) 的切点表达式,execution为关键字,而 *  greetTo(..) 为操作参数。  两者联合起来表示目标类greeTo(..) 方法的连接点.

Spring支持9个@AspectJ切点表达式函数,它们用不同的方式连接目标类的连接点,根据描述对象的不同,可以大致分为四种类型:

  • 方法切点函数:通过描述目标类方法信息定义连接点;
  • 方法入参切点函数:通过描述目标类方法入参的信息定义连接点;
  • 目标类切点函数:通过描述目标类类型信息定义连接点;
  • 代理类期切点函数:通过描述 目标类的代理类的信息定义连接点。



二、在函数入参中使用通配符

   有些函数的入参可以接受通配符,@AspectJ支持3种通配符:

  • *        匹配任意字符,但它只能匹配上下文中的一个元素;
  • ..        匹配任意字符,可以匹配上下文中的多个元素,但在表示类时,必须和 *  联合使用,而在表示入参时则单独使用;
  • +        表示按类型匹配指定类的所有类,必须跟在类名后面,如 com.baobaotao.Car+   ,继承或扩展指定类的所有类,同时还包括指定类本身.

    @AspectJ函数按其是否支持通配符及支持的程度,可以分为:

  • 支持所有通配符:execution()、within(),如within(com.baobaotao.*)、within(com.baobaotao..*.*Service+) 等?
  • 仅支持+通配符:args()、this()、target(),如args(com.baobaotao.Waiter+)、target(java.util.List+) 等 。虽然这三个函数可以支持+通配符,但其意义不大,因为对于这些函数来说,使用和不使用+都是一样的.
  • 不支持通配符: @args()、@within()、@target和@annotation。

注:args()、this()、target()、@args()、@this()、@target() 和@annotation这 7个函数除了可以指定类名外,也可以指定变量名,并将目标对象中的变量绑定到增强的方法中。

三、逻辑运算符

          切点表达式由切点函数组成,切点函数之间还可以进行逻辑运算,组成复合节点,Spring支持以下的切点运算符:

(1)  &&  与操作符,相当于切点的交集运算,如果在Spring 的XML配置文件中使用切点表达式,由于&是XML特殊字符,所有使用转义字符&& 表示。为了使用方便,Spring提供了一个等效的运算符"and"。如

within(com.baobaotao..*) and args(String) 表示在com.baobaotao包下所有类(当前包以及子包)拥有一个String入参的方法;

(2)    ||  或操作符,相等于切点的并集运算,or是等效的操作符。

(3)   ! 操作符 ,相当于切点的反集运算, not  是等效的操作符.

    四、不同的增强类型

 @Before 

前置增强,相当于BeforeAdvice的功能,Before注解类拥有两个成员:

value :该成员用于定义切点;

argsNames:由于无法通过Java反射机制获取方法入参名,所以如果在Java编译时未启用调试信息获取需要在运行期解析切点,就必须通过这个成员指定注解所标注增强方法的参数名(注意两者名字必须相同),多个参数名用逗号分隔。

@AfterReturning

                后置增强,相当于AfterReturningAdvice,AfterReturning注解类拥有四个成员:

value : 该成员用于定义切点;

pointcut :表示切点的信息,如果显示指定pointcut值,它将覆盖value的设置值,可以将pointcut成员看成是value的同义词;

returning :将目标对象方法的返回值绑定给增强的方法;

argNames: 如前所述.

@Around 

环绕增强,相当于MethodInterceptor,Around注解y类拥有两个成员;

value: 该成员用于定义切点;

argNames:如前所述

     @AfterThrowing

抛出增强,相当于ThrowsAdvice,AfterThrowing注解类拥有四个成员:

value :该成员用于定义切点;

pointcut:表示切点的信息,如果显示指定pointcut值,它将覆盖value的设置值,可以将pointcut成员看成是value的同义词;

throwing :将抛出的异常绑定到增强方法中;

               argNames:如前所述

   

  @After 

Final增强,不管是抛出异常或者是正常退出,该增强都会得到执行,该增强没有对应的增强接口,可以把它看成是ThrowsAdvice和AfterReturningAdvice的混合物,一般用于释放资源,相当于try{} finazlly{}的控制流,Afteer注解类拥有两个成                    员:

value :该成员用于定义切点;

args:如前所述

@DeclareParents

引介增强,相当于IntroductionInterceptor,DeclareParents注解类拥有两个成员:

value:  该成员用于定义切点,它表示在哪个目标类上引用引介增强;

defaultImpl: 默认的接口实现类。

Spring AOP (二)的更多相关文章

  1. 代理模式及Spring AOP (二)

    一.Spring AOP   1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...

  2. Spring AOP(二)--注解方式

    本文介绍通过注解@AspectJ实现Spring AOP,这里要重点说明一下这种方式实现时所需的包,因为Aspect是第三方提供的,不包含在spring中,所以不能只导入spring-aop的包,为了 ...

  3. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  4. Spring技术内幕:Spring AOP的实现原理(二)

    **二.AOP的设计与实现 1.JVM的动态代理特性** 在Spring AOP实现中, 使用的核心技术时动态代理.而这样的动态代理实际上是JDK的一个特性.通过JDK的动态代理特性,能够为随意Jav ...

  5. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  6. 深入理解Spring AOP之二代理对象生成

    深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...

  7. spring AOP 之二:@AspectJ注解的3种配置

    @AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...

  8. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP

    基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...

  9. Spring 学习二-----AOP的原理与简单实践

    一.Spring  AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...

随机推荐

  1. mongo 存储过程

    摘要 本文主要介绍mongo存储过程,mongo 存储过程其实就是JS方法,然后通过eval 方法来执行,但是这个方法在3.0 depreate了,也就是在未来的版本,这个功能可能不提供了.从目前的j ...

  2. activiti uuid主键

    1.1.1.  activiti默认主键生成方式 ; 下面我们看一下主键的生成策略:主键的生成策略定义在IdGenerator接口中,接口定义如下所示: public interface IdGene ...

  3. ORACLE数据库学习之数据库的优化

     数据库的优化 概述 影响数据库性能的因素包括:系统.数据库.网络. 数据库的优化包括:优化数据库磁盘I/O.优化回滚段.优化Rrdo日志.优化系统全局区.优化数据库对象. 监控数据库的性能: 在 ...

  4. iOS9中如何注册远程通知

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在以往的版本中,我们可以通过: [[UIApplication ...

  5. JDBC的使用五大步骤以及查询操作-数据库编程(二)

    jdbc的使用步骤 1.加载jdbc的驱动. 2.打开数据库的连接. 3.建立一个会话,然后执行增删改查等基本的操作. 4.对结果进行处理 5.对环境进行清理,比如关闭会话等. 查询操作 首先用Cla ...

  6. css模块化及CSS Modules使用详解

    什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...

  7. linux crontab定时任务详解

    1.  为当前用户创建cron服务: crontab  -e 例如 文件内容如下(每隔1分钟执行sql脚本): */1 * * * * mysql -h127.0.0.1 -uroot -proot ...

  8. 创建银行API

    DECLARE lc_output VARCHAR2(3000); lc_msg_dummy VARCHAR2(3000); lc_return_status VARCHAR2(3000); lc_m ...

  9. windows与linux的文件夹共享

    公司配备了一台性能还算不错的电脑,不过是台式机.我在上面装了ubuntu,但是我的代码工作目录全部都在我自己的win7笔记本上.有时程序开多了就容易卡,于是想到用装ubuntu的台式机来访问我win7 ...

  10. UNIX网络编程——TCP长连接与短连接的区别

    一.TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,server回应client,然后 ...