Spring AOP (二)
下面介绍@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 (二)的更多相关文章
- 代理模式及Spring AOP (二)
一.Spring AOP 1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...
- Spring AOP(二)--注解方式
本文介绍通过注解@AspectJ实现Spring AOP,这里要重点说明一下这种方式实现时所需的包,因为Aspect是第三方提供的,不包含在spring中,所以不能只导入spring-aop的包,为了 ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- Spring技术内幕:Spring AOP的实现原理(二)
**二.AOP的设计与实现 1.JVM的动态代理特性** 在Spring AOP实现中, 使用的核心技术时动态代理.而这样的动态代理实际上是JDK的一个特性.通过JDK的动态代理特性,能够为随意Jav ...
- spring学习(二) ———— AOP之AspectJ框架的使用
前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...
- 深入理解Spring AOP之二代理对象生成
深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...
- spring AOP 之二:@AspectJ注解的3种配置
@AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...
- Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP
基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
随机推荐
- Linux-2.6.25 TCPIP函数调用大致流程
插口层系统调用send sys_send sys_sendtosendto sys_sendto sock_sendmsgsendmsg sys_send ...
- RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...
- JAVA面向对象-----成员内部类的访问方式
成员内部类的访问方式 1.内部类可以直接访问外部类的成员属性.(孙悟空相当于内部类飞到牛魔王的肚子里面去). 2.外部类需要访问内部类的成员属性时需要创建内部类的对象. 1.在外部类的成员函数中创建内 ...
- hive数据类型及其数据转换
由于需要使用hive sql进行数据查询,同时涉及多个不同类型的字段的组合,看Hive sql的文档相关和资料才知道,hive是支持大部分基础数据类型之间的相互转换的. 那么,hive本身支持哪些数据 ...
- maven配置详解
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...
- java之IO流详解(一)
IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 InputStream 字节输出流 OutputStream 字符流 字符输入流 Reader 字 ...
- Android动态换肤(二、apk免安装插件方式)
在上一篇文章Android动态换肤(一.应用内置多套皮肤)中,我们了解到,动态换肤无非就是调用view的setBackgroundResource(R.drawable.id)等方法设置控件的背景或者 ...
- Android7.0 多窗口你值得拥有
Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...
- ubunut系统清理系统根目录下缓存文件夹.cache超大导致磁盘不足
在使用中突然发现系统超慢,没有做什么特别的操作. 只好重启下电脑,重启后提示系统空间不足1G.挨个查看文件夹大小,没有发现问题,然后就用Ctrl + H显示隐藏文件夹后再继续逐个查看大小,发现.cac ...
- GDAL使用插件方式编译HDF4、HDF5以及NetCDF的bug修改
GDAL库中提供了很方便的插件机制来扩展支持的数据格式,比如HDF4.HDF5.NetCDF.FileGDB.Postgre.Oralce等等.都可以通过插件的方式来使得GDAL支持相应的格式.最近将 ...