读书人

Spring2.5 诠注 Aspect AOP

发布时间: 2012-08-08 14:32:45 作者: rapoo

Spring2.5 注解 Aspect AOP
着手使用@AspectJ

我们知道在低版本的Spring AOP中,你必须使用Pointcut和Advice接口描述切点和增强,并用Advisor组合两者描述一个切面,@AspectJ则采用JDK 5.0的注解技术描述切点和增强类型,而增强的横切逻辑就在被标注的POJO中定义。

使用前的准备

在使用@AspectJ之前,首先你得保证你所使用的JDK的版本是5.0及以上版本,否则无法使用注解技术。 Spring在处理@Aspect注解表达式时,需要使用位于<SPRING_HOME>/lib/asm/目录下asm的类包:asm-2.2.2.jar、asm-commons-2.2.2.jar和asm-util-2.2.2.jar。asm是轻量级的字节码处理框架,因为Java的反射机制无法获取入参名,Spring就利用asm处理@AspectJ中所描述的方法入参名。此外,Spring采用AspectJ提供的@AspectJ注解类库及相应的解析类库,它位于<SPRING_HOME>/lib/aspectj目录下,将目录下的aspectjrt.jar和aspectjweaver.jar类包加入类路径中。

一个简单的例子

在做好上节中所提到的前置工作后,我们就可以开始编写一个基于@AspectJ的切面了,首先来看一个简单的例子,以便对@AspectJ有一个切身的认识。

下面,我们用@AspectJ注解对一个POJO进行标注,将使其成为一个切面类:
PreGreetingAspect


图 1 切面的信息构成

PreGreetingAspect类通过注解和代码,将切点、增强类型和增强的横切逻辑揉合到一个类中,使切面的定义浑然天成。如果在低版本Spring AOP中,你必须同时创建增强类,切点类以及切面类,并使三者联合表达相同的信息。

NaiveWaiter是一个Bean,它拥有一个greetTo()的方法,这个方法连接点匹配于上面我们通过@AspectJ所定义的切点,为了方便后续的说明,我们给出NaiveWaiter的代码:



首先,在配置文件中引入aop命名空间,如①、②处所示,然后通过aop命名空间的<aop:aspectj-autoproxy />声明自动为Spring容器中那些匹配@AspectJ切面的Bean创建代理,织入切面。当然,Spring在内部依旧采用AnnotationAwareAspectJAutoProxyCreator进行自动代理的创建工作,但具体实现的细节已经被<aop:aspectj-autoproxy />隐藏起来了。

<aop:aspectj-autoproxy />有一个proxy-target-class属性,默认为false,表示使用JDK动态代理织入增强,当配置为<aop:aspectj-autoproxy proxy-target-/>时,表示使用CGLib动态代理技术织入增强。不过即使proxy-target-class设置为false,如果目标类没有声明接口,则Spring将自动使用CGLib动态代理。

下面给出一些常见切入点表达式的例子。

任意公共方法的执行:
execution(public * *(..))

任何一个以“set”开始的方法的执行:
execution(* set*(..))

AccountService 接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
这里 AccountService 是接口名 ; * 是方法名

定义在service包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
这里第一个*表示类, 第2个* 表示方法

定义在service包或者子包里的任意方法的执行:
execution(* com.xyz.service..*.*(..))
这里..表示包或者子包 第一个*表示类, 第2个* 表示方法

读书人网 >ASP

热点推荐