`

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
package com.baobaotao.aspectj.aspectj; 

import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

@Aspect ①通过该注解将PreGreetingAspect标识为一个切面 
public class PreGreetingAspect{ 
   @Before("execution(* greetTo(..))") ②定义切点和增强类型 
   public void beforeGreeting(){③增强的横切逻辑 
      System.out.println("How are you"); 
   } 
} 


我们“惊奇”地发现这个切面没有实现任何特殊的接口,它只是一个普通的POJO。它特殊的地方在于使用了@AspectJ注解。
首先,在PreGreetingAspect类定义处,标注了一个@Aspectj注解,第三方处理程序就可以通过类是否拥有@Aspectj注解判断其是否是一个切面,如①所示。
其次,在beforeGreeting()方法标签处,标注了@Before注解,并为该注解提供了成员值"execution(* greetTo(..))",如②所示。②处的注解提供了两个信息:@Before注解表示该增强是前置增强,而成员值通过@ApsectJ切点表达式语法定义切点:即在目标类的greetTo()方法上织入增强,greetTo()方法可以带任意的入参和任意的返回值。
最后,在③处的beforeGreeting()方法是增强的横切逻辑,该横切逻辑在目标方法前调用,我们通过下图描述这种关系:


图 1 切面的信息构成

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

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

package com.baobaotao;

public class NaiveWaiter implements Waiter {
   public void greetTo(String clientName) {
      System.out.println("NaiveWaiter:greet to "+clientName+"...");
   }

   public void serveTo(String clientName){
      System.out.println("NaiveWaiter:serving "+clientName+"...");
   }
}

虽然可以通过编程的方式织入切面,但一般情况下,我们还是使用Spring的配置自动完成创建代理织入切面的工作。
<bean id="waiter" class="com.baobaotao.NaiveWaiter" /> ①目标Bean
②使用了@AspectJ注解的切面类
<bean class="com.baobaotao.aspectj.example.PreGreetingAspect" />
③自动代理创建器,自动将@AspectJ注解切面类织入到目标Bean中
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/> 

AnnotationAwareAspectJAutoProxyCreator能够将@AspectJ注解切面的自动织入到目标Bean中。这里,PreGreetingAspect是使用了@AspectJ注解描述的切面类,而NaiveWaiter是匹配切点的目标类。

如果使用基于Schema的aop命名空间进行配置,事情就更简单了:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" ①
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
http://www.springframework.org/schema/aop ② 
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> 

   <aop:aspectj-autoproxy /> ③基于@AspectJ切面的驱动器
   <bean id="waiter" class="com.baobaotao.NaiveWaiter" />
   <bean class="com.baobaotao.aspectj.example.PreGreetingAspect" />
</beans>


首先,在配置文件中引入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-class="true" />时,表示使用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个* 表示方法 
  • 大小: 8.7 KB
分享到:
评论

相关推荐

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...

    Spring2.5使用AOP需要的aspectJ

    在Spring 2.5版本中,面向切面编程(AOP)是一个强大的功能,它允许开发者定义“切面”来封装横切关注点,如日志、事务管理、权限检查等,使得代码更加模块化和可重用。AspectJ是一个成熟的AOP框架,Spring在其AOP...

    spring2.5注解驱动

    Spring 2.5还支持基于注解的AOP(面向切面编程)。`@Aspect`注解用于定义一个切面,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`注解用于声明前置通知、后置通知、环绕通知、返回后通知和...

    使用Spring的注解方式实现AOP的细节

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    精通Spring2.5pdf书籍proSpring2.5

    其次,Spring 2.5对AOP的支持也有所加强,新增了对JSR-250注解(如@PostConstruct和@PreDestroy)的内置支持,使得生命周期管理更加简单。同时,增强了切面的定义方式,使得切面可以更加灵活地与业务逻辑结合。 在...

    Spring 2.5 Aspect-Oriented Programming source code

    Spring 2.5 是 Spring 框架的一个重要版本,它在面向切面编程(Aspect-Oriented Programming,AOP)方面提供了强大的支持。面向切面编程是一种编程范式,旨在将关注点分离,使代码更加模块化,尤其是处理那些跨越多...

    Spring2.5-中文参考手册chm

    Spring 2.5引入了增强的面向切面编程(Aspect-Oriented Programming,AOP)支持,使得开发者可以更方便地实现横切关注点,如日志、事务管理等。AOP通过定义切面、通知(advice)和连接点(join point)来实现代码的...

    Spring2.5 源代码

    Spring 2.5增加了对注解驱动的切面的支持,`@Aspect`、`@Before`、`@After`等注解使得AOP的使用更加直观。 4. **Bean工厂与ApplicationContext**: Spring 2.5中的Bean工厂是容器的基础,而ApplicationContext是更...

    spring 2.5框架图

    在Spring 2.5中,AOP支持更灵活的切入点表达式和更多类型的切面,如注解驱动的切面,这使得AOP更加易用和强大。 3. **Beans包**:这是Spring框架的基础,包含Bean的定义、实例化、配置和管理。在Spring 2.5中,对...

    spring2.5中文文档

    3. **AOP增强**:Spring的面向切面编程(AOP)在2.5版本中也有所改进,新增了`@Aspect`注解,允许开发者直接在类级别定义切面。此外,还支持了注解驱动的通知,如`@Before`、`@After`、`@Around`和`@AfterThrowing`。 ...

    传智播客spring2.5源代码

    3. **AOP(Aspect-Oriented Programming,面向切面编程)**:在Spring 2.5中,AOP支持更加丰富,包括注解式切面定义,如`@Before`、`@After`、`@Around`等,以及基于注解的切入点表达式,让切面的定义更加直观。...

    Spring2.5-中文参考手册chm.zip

    8. **测试支持**:Spring 2.5提供了更完善的测试工具,如`@RunWith(SpringJUnit4ClassRunner.class)`和`@ContextConfiguration`注解,使得基于Spring的应用测试更加便捷。 9. **集成其他框架**:Spring 2.5加强了与...

    spring2.5基于注解例子程序

    Spring 2.5增强了对AOP的支持,`@Aspect`和`@Before`、`@After`、`@Around`、`@AfterReturning`、`@AfterThrowing`等注解使得编写切面变得直接且易读。开发者可以使用这些注解定义通知,并精确控制何时以及如何执行...

    spring 2.5中文帮助文档

    Spring框架是Java开发中的一个核心组件,它强调了依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP),为构建可测试、模块化且松耦合的应用提供了强大支持。 在Spring 2.5...

    spring2.5中文文档(PDF)

    3. **AOP增强**:在2.5版本中,AOP支持更加丰富,可以使用注解定义切面,如`@Before`、`@After`、`@Around`等,以及`@Aspect`注解用于声明切面类。 4. **数据访问集成**:Spring 2.5增强了对各种数据访问技术的支持...

    spring2.5常用包

    2. **AOP(Aspect-Oriented Programming)**:Spring 提供了面向切面编程的支持,允许开发者定义“切面”,这些切面可以跨越多个类的多个方法,实现如日志、事务管理等通用功能。@Aspect 和 @Before、@After、@...

    spring 2.5 api chm(英文正宗不骗人,喜欢就下)

    4. **改进的AOP支持**:Spring 2.5对AOP的实现进行了优化,增加了对注解驱动的切面的支持,例如`@Before`、`@After`、`@Around`等,使得切面的定义更加直观和简洁。 5. **更多数据访问支持**:在Spring 2.5中,对...

    传智播客 spring2.5源代码_lib包

    10. **Spring AOP增强**: Spring 2.5的AOP增强了对AspectJ的支持,可以使用AspectJ的语法定义切点和通知,提供了更强大的切面编程能力。 这个"传智播客 spring2.5源代码_lib包"包含了Spring 2.5框架中的所有库文件...

    Spring2.5开发PDF+Spring2.5CHM

    在AOP(面向切面编程)方面,Spring 2.5引入了更强大的切面定义和更多的注解支持。例如,`@Aspect`注解定义了一个切面,而`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`则分别用于定义前置...

Global site tag (gtag.js) - Google Analytics