Spring Framework Core(5) - 使用Spring 面向切面编程(1)

5 Aspect Oriented Programming with Spring

通过提供另一种考虑程序结构的方式,面向方面编程(AOP)补充了面向对象编程(OOP)。OOP中模块化的关键单元是类,而在AOP中模块化的单元是Aspect。Aspect支持跨多个类型和对象的关注点(例如事务管理)的模块化。(在AOP文献中,这样的关注点通常被称为“横切”关注点。)

Spring的关键组件之一是AOP框架。虽然Spring IoC容器不依赖于AOP(这意味着如果不想使用AOP,就不需要使用AOP),但是AOP补充了Spring IoC,提供了一个功能非常强大的中间件解决方案。

                   Spring AOP with AspectJ pointcuts

Spring通过使用schema-based的方法或@AspectJ注解提供了编写定制方面的简单而强大的方法。这两种风格都提供了完全类型化的建议和使用AspectJ切入点语言,同时仍然使用Spring AOP进行weave。本章讨论了基于schema和@ aspectj的AOP支持。下一章将讨论较低级别的AOP支持。

AOP在Spring框架中用于:

  • 提供声明性企业服务。此类服务中最重要的是声明性事务管理。
  • 让用户实现自定义方面,用AOP补充他们对OOP的使用。

如果您只对通用声明性服务或其他预打包的声明性中间件服务(如pooling)感兴趣,那么您不需要直接使用Spring AOP,并且可以跳过本章的大部分内容。

5.1 AOP概念

让我们从定义一些核心的AOP概念和术语开始。这些术语不是特定于spring的。不幸的是,AOP术语不是特别直观。然而,如果Spring使用自己的术语,则会更加混乱。

  • Aspect:跨越多个类的关注的模块化。事务管理是企业Java应用程序中横切关注点的一个很好的例子。在Spring AOP中, 切面是通过使用常规类( schema-based的方法)或使用@Aspect注释的常规类(@AspectJ样式)来实现的。
  • Join point:程序执行过程中的一个点,如方法的执行或异常的处理。在Spring AOP中,Join point 总是表示方法执行。
  • Advice:Aspect在特定Join point上采取的操作。不同类型的Advice包括“around”, “before” and “after” (稍后会讨论Advice类型)。许多AOP框架,包括Spring,将Advice建模为拦截器,并维护围绕Join point的拦截器链。
  • Pointcut:匹配Join point的谓词。Advice与Pointcut表达式相关联,并在与Pointcut匹配的任何Join point上运行(例如,执行具有特定名称的方法) 。 Join point与Pointcut表达式匹配的概念是AOP的核心,Spring默认使用AspectJ Pointcut表达式语言。
  • Introduction:代表类型声明其他方法或字段。Spring AOP允许您将新的接口(和相应的实现)引入任何被通知的对象。例如,您可以使用一个Introduction来让一个bean实现一个IsModified接口,以简化缓存。(Introduction在AspectJ社区中称为类型间声明。)
  • Target object:被一个或多个Aspect Advice的对象。也称为“被通知对象”。因为Spring AOP是通过使用运行时代理来实现的,所以这个对象总是一个代理对象。
  • AOP proxy:为了实现Aspect规约(通知方法执行等)而由AOP框架创建的对象。在Spring框架中,AOP代理是JDK动态代理或CGLIB代理。
  • Weaving:将Aspect与其他应用程序类型或对象链接以创建an advised object.。这可以在编译时(例如,使用AspectJ编译器)、加载时或运行时完成。与其他纯Java AOP框架一样,Spring AOP在运行时执行Weaving。

Spring AOP包括以下类型的advice:

  • Before advice:在Join point之前运行但不能阻止执行流继续到Join point的Advice(除非它抛出异常)。
  • After returning advice:advice在连接点正常完成后运行(例如,如果一个方法没有抛出异常返回)。
  • After throwing advice:如果一个方法通过抛出异常退出,则要执行的Advice。
  • After (finally) advice:无论Join point以何种方式退出(正常或异常返回),都将执行通知。
  • Around advice:围绕Join point(如方法调用)的Advice。这是最强大的Advice.Around通知可以在方法调用前后执行自定义行为。它还负责选择是继续到Join point ,还是通过返回它自己的返回值或抛出异常来简化Advice的方法执行。

Around advice是最常用的Advice。因为Spring AOP和AspectJ一样,提供了各种各样的Advice类型,所以我们建议您使用最不强大的通知类型来实现所需的行为。例如,如果只需要用方法的返回值更新缓存,则最好实现after returning advice,而不是around advice,尽管around advice可以完成相同的工作。使用最特定的Advice类型可以提供更简单的编程模型,减少出错的可能性。例如,您不需要在用于around advice的join point上调用proceed()方法,因此,您不可能对它调用失败。

所有的Advice参数都是静态类型的,这样您就可以使用适当类型的Advice参数(例如方法执行返回值的类型),而不是对象数组。

Join point与Pointcu匹配的概念是AOP的关键, 这是它与只提供拦截的老技术的区别。Pointcut使Advice能够独立于面向对象的层次结构。例如,可以将提供声明性事务管理的around advice应用于一组跨多个对象的方法(例如服务层中的所有业务操作)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值