InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

使用事件模型定制Grails应用的行为

作者 Srini Penchikala 译者 张龙 发布于 2008年10月7日

领域
语言 & 开发
主题
Java ,
动态语言
标签
Groovy ,
Grails

无论在构建过程中,还是在创建单个组件(如领域类控制器)时,典型的Grails应用都会在应用生命周期的关键点抛出事件。我们可以将这些应用事件作为扩展点来创建监听器对其进行拦截,并使用定制行为对其作出响应。除了HTTP请求和响应这种传统的Web应用生命周期以外,Grails还提供了大量定制的接触点,开发者可以利用它们处理事件模型、给出定制的应用行为。这些接触点包括:

  • 在构建阶段抛出的事件,
  • Web应用的启动和关闭,
  • Grails领域类的生命周期事件。

针对Gant脚本的事件处理器首次出现在0.5版中,并在Grails目标和插件脚本的执行过程中被触发。它们在Events.groovy脚本中以闭包的集合形式实现(就像Grails中的其它东西一样),其名称都以“event”开头。当Gant脚本中发生“事件”时,Grails就会调用相应的事件闭包。Grails在如下位置搜寻这些脚本:

  • USER_HOME/.grails/scripts——用户特定的事件处理器
  • PROJECT_HOME/scripts——应用特定的事件处理器
  • PROJECT_HOME/plugins/*/scripts——插件特定的事件处理器

我们可以在宏观以及微观层次处理Grails的事件。宏观层次就是构建和应用范围,而微观层次处于领域层,领域类在与数据库发生交互时发布事件。最近Scott Davis撰写了一篇文章,谈到了Grails的事件模型以及贯穿于Grails应用生命周期的事件如何能帮助开发者更好地定制应用的行为。开发者可以通过创建一个Events.groovy文件、并在其中编写定制代码来扩展构建过程,而无需修改标准的Grails脚本。

构建事件:

“grails create-app”和“grails run-app”(或者是“grails war”)之间所有的构建过程步骤都会在关键点抛出事件。你可以通过创建监听器来监听项目中的这些构建事件。 这些事件还可用于安装后配置和应用升级。当你想定制GRAILS_HOME/scripts中的脚本时(以抛出定制事件),Scott建议将这些文件拷贝到项目中的scripts目录中,以便这些客户化脚本也与其他文件一样被加到源码控制系统中。

应用事件:

除了构建事件,Grails开发者还可以捕获应用事件以定制应用的逻辑。在Grails每次启动和停止时,位于grails-app/conf目录中的引导文件都会运行。该文件中的init块会在应用启动时被调用,destroy块会在应用停止时被调用。如果想在init和destroy事件触发时查看调试信息,请键入以下命令以交互模式启动Grails:

grails interactive" 

扩展应用事件的一个例子就是在启动时向数据库增加新的记录。Scott提到了在BootStrap.groovy中利用Failsafe数据库进行插入和删除以避免数据库中的重复记录。他还解释了Bootstrap脚本中特定于环境(开发、测试或者产品)的行为。这要使用GrailsUtil类,请在脚本开头导入grails.util.GrailsUtil,并调用静态方法GrailsUtil.getEnvironment()来确定你正处在哪种模式下(由于Groovy简化的getter语法,该方法调用可以简写为GrailsUtil.environment)。

领域类事件:

这包括针对CRUD操作的四个事件回调:onLoad、beforeInsert、befortUpdate及beforeDelete,当执行数据库操作时就会触发它们。

  • onLoad在类从数据库中加载时被调用。
  • beforeInsert在save()方法执行前被调用。
  • beforeUpdate在update()方法执行前被调用。
  • beforeDelete在delete()方法执行前被调用。

Grails支持GORM事件Hibernate插件,以对上述事件进行补充。GORM事件的定制包括事件的注册,在删除、插入及更新发生时会触发这些事件。Hibernate的事件插件为领域模型提供了支持,可以使用以下这些方法来对Hibernate的事件系统进行回调:afterInsert、afterUpdate、afterDelete、 beforeLoad、afterLoad、beforeSave及afterSave。其它的领域层事件就是领域类的时间戳了。如果你提供了一对特别命名的字段(lastUpdated与dateCreated),GORM就会自动为类增加时间戳。

在Web应用的其它层上,Grails提供了Web流执行事件以管理Web流的执行(从一种状态转化为另一种状态)和Ajax事件(如果Web应用中发生了某个事件就会去调用一个特定的JavaScript函数)。

Grails还支持对自动重新加载事件的拦截,这可用来监控资源的改变,当发生变化时会重新加载资源。这就是Grails在运行时能重新加载应用的原因。

查看英文原文:Customize Grails Application Behavior Using the Event Model

译者 张龙 热衷于编程,乐于分享,对新技术有强烈的探索欲,对Java轻量级框架有一定研究。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。