科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用Spring 2.0和AspectJ简化企业应用程序

用Spring 2.0和AspectJ简化企业应用程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在本文中,作者首先了介绍在典型的企业应用程序中,Spring AOP和AspectJ适用于什么地方,之后介绍在2.0中新的Spring AOP支持。

作者:Adrian Colyer译者 俞黎敏 来源:infoq.com 2007年11月18日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共10页)

采用路线图

理论说得够多了……让我们看一下你在企业应用程序中实际上如何以及为什么要使用AOP的一些例子。开始AOP,并不一定是一种肯定一切或者否定一切的爆炸性方法。采用可以分阶段进行,每个阶段都为增加的技术暴露回报以更多的益处。

建议的采用路线图是只开始使用Spring提供的开箱即用的方面(例如事务管理)。许多Spring用户将已经在这么做了,但多半不太欣赏AOP被“背地里”使用着。根据这一点,你可以实现在使用Spring AOP的Web、服务和数据访问层中可能会有的任何定制横切需求。

实现影响领域模型的特性必需使用AspectJ。你听到这句话时可能感到惊讶:有大量的AspectJ方面对于你在开发时都非常有帮助,而且不影响在产品中以任何方式运行的应用程序。这些方面可以增加很多价值,并且采用风险非常小,因此建议用它们开始AspectJ。根据这一点,你可以选择通过AspectJ实现“基础结构的”需求——典型的实例为剖析(profiling)、跟踪(tracing)、错误处理(error-handling)等等。随着你越来越习惯于AspectJ和所配套的工具,最终你可以用方面在领域逻辑自身中开始实现功能。

关于AOP采用路线图的其他信息,请见《Eclipse AspectJ》一书中的第11章,或者developerWorks AOP@Work系列中“Next steps with aspects”一文。这两个资源都专门关注AspectJ,而我在这里则正在讨论同时使用Spring和AspectJ。

让我们依次看一下这每一种采用阶段。

当在一个工程中使用AOP时,首先要做的最有意义的事是定义一组切入点表达式,描述你应用程序中的不同模块或者层。这些切入点表达式在采用的所有不同阶段中都将很有帮助,并且定义一次将减少重复,改善代码的清晰度。如果我们用@AspectJ符号编写这些切入点,它们就可以通过任何常规的Java 5编译器进行编译。利用一般的AspectJ语言关键字也可能编写相同的东西,用ajc编译源文件,并将生成的.class文件添加到classpath中。我将用@AspectJ作为开始Spring AOP的两种方法中更为容易的那一种。许多读者将会熟悉Spring所携带的“jpetstore”范例应用程序。我已经稍微重写了这个应用程序,给它增加了一些方面(本文稍后会讨论到)。以下是在pet store中捕捉主要层和模块的“SystemArchitecture”方面的开头部分:

@Aspect
public class SystemArchitecture {
/**
* we're in the pet store application if we're within any
* of the pet store packages
*/
@Pointcut("within(org.springframework.samples.jpetstore..*)")
public void inPetStore() {}
// modules
// ===========
@Pointcut("within(org.springframework.samples.jpetstore.dao..*)")
public void inDataAccessLayer() {}
@Pointcut("within(org.springframework.samples.jpetstore.domain.*)")
public void inDomainModel() {}
@Pointcut("within(org.springframework.samples.jpetstore.service..*)")
public void inServiceLayer() {}
@Pointcut("within(org.springframework.samples.jpetstore.web..*)")
public void inWebLayer() {}
@Pointcut("within(org.springframework.samples.jpetstore.remote..*)")
public void inRemotingLayer() {}
@Pointcut("within(org.springframework.samples.jpetstore.validation..*)")
public void inValidationModule() {}
// module operations
// ==================
@Pointcut("execution(* org.springframework.samples.jpetstore.dao.*.*(..))")
public void doaOperation() {}
@Pointcut("execution(* org.springframework.samples.jpetstore.service.*.*(..))")
public void businessService() {}
@Pointcut("execution(public * org.springframework.samples.jpetstore.validation.*.*(..))")
public void validation() {}
}

既然我们已经有了谈论应用程序(“inServiceLayer”、“businessOperation”等等)的术语,让我们用它来做一些有意义的事情吧。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章