扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Adrian Colyer译者 俞黎敏 来源:infoq.com 2007年11月18日
关键字:
在本页阅读全文(共10页)
底层的技术:AspectJ和Spring AOP简介
AOP使得实现在应用程序中影响多个点的特性变得更加简单。这主要因为AOP提供了对名为通知(advice)的这个东西的支持。通知不同于必须显式调用的方法,每当发生匹配的触发事件时,它就自动地执行。继续事务主题,触发事件是服务层中一个方法的执行,并且通知逻辑提供所需的事务划分。用AOP的话来说,触发事件被称作连接点(join point),而切入点表达式(pointcut expression)则用来选择通知要在那里运行的连接点。这个简单的倒置意味着不用将调用散布到你全部应用程序代码中的事务管理器,而是只要编写一个切入点表达式,定义你需要事务管理器在什么地方完成某事的所有点,并将它与适当的通知关联起来。AspectJ和Spring AOP提供对这个模型的支持,事实上,它们有着完全相同的切入点表达语言。
在接下来的讨论中,注意Spring和AspectJ保持为独立的工程,这很重要。Spring只使用反射和由AspectJ 5作为一个库所暴露的工具API。Spring 2.0仍然是一个运行时基于代理的框架,且AspectJ织入器(weaver)不用于Spring方面。
我相信你们中大多数人都知道,AspectJ是一种包含完整编译器的语言(构建为Eclipse JDT Java编译器的一个扩展),对离线或者在运行时将(与)二进制的class文件(链接的方面)作为类织入的支持,被加载到了虚拟机中。AspectJ的最新发布版本是AspectJ 5,它为Java 5语言提供完整的支持。
AspectJ 5也引入了方面声明的第二种风格,我们称之为“@AspectJ”,它允许你将一个方面编写为一个包含注解的Java类。这种方面可以通过一般的Java 5编译器进行编译。例如,传统的“HelloWorld”方面在AspectJ编程语言中看起来像这样:
public aspect HelloFromAspectJ { |
Hello World! |
@Aspect |
就本文而言,AspectJ 5中另一项重要的新特性是一个完全AspectJ感知的反射API(你可以在运行时为它的通知和切入点成员等等请求一个方面),和让第三方使用AspectJ的切入点解析和匹配引擎的工具API。这些API的第一大用户,就像你很快会见到的,是Spring AOP。
与AspectJ相反,Spring AOP是一个基于代理的运行时框架。在使用Spring AOP时,并没有特殊的工具或者构建需求,因而Spring AOP是一种很容易开始的方法。作为一种基于代理的框架,它既有优点也有缺点。除了已经提到过的容易使用的因素之外,基于代理的框架还能够独立地通知相同类型的不同实例。将这一点与AspectJ基于类型的语义相比,在这里,类型的每一个实例都有着相同的行为。对于像Spring这样的框架而言,能够独立地通知独立的对象(Spring beans)是一个重要的必要条件。另一方面,Spring AOP只支持AspectJ功能的一个子集:有可能在Spring beans中通知方法的执行,但是其他没什么。
基于代理的框架一般会有同一性的问题:有两个对象(代理和目标)都表示应用程序中的同一个实体。必须始终小心地传递适当的引用,确保给实例化过的任何新的目标对象创建代理。Spring AOP通过管理bean实例化(以便代理可以被透明地创建)和通过依赖注入(以便Spring始终可以注入适当的引用),巧妙地解决了这些问题。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者