写点什么

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

  • 2008-10-07
  • 本文字数:1743 字

    阅读完需:约 6 分钟

无论在构建过程中,还是在创建单个组件(如领域类控制器)时,典型的 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

2008-10-07 09:34768
用户头像

发布了 88 篇内容, 共 263.0 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

分布式政企应用如何快速实现云原生的微服务架构改造

IT科技苏辞

阿里,快手,拼多多等 7 家大厂 Java 面试真题,Java 笔试题及答案详解

三十而立

【Meetup回顾第1期】竟是这样的国产数据库,YashanDB技术内幕曝光

YashanDB

袋鼠云春季生长大会最新议程来啦!4月20日我们云上见

袋鼠云数栈

大数据 数字化转型

第二届“鼎新杯”数字化转型应用大赛申报通道正式开启

信通院IOMM数字化转型团队

数字化转型 鼎新杯

2023最新整理上千道Java面试攻略,近500页PDF文档

会踢球的程序源

Java 面试 找工作 java面试 应届生

全面拥抱Serverless,腾讯云大数据Elasticsearch开启云原生新范式

科技热闻

听说谛听闹退休?感知网络接班啦!

白洞计划

感知网络

总结年初到 10 月底 Java 基础、架构面试题,共计 1327 道!涵盖蚂蚁金服、腾讯、字节跳动、美团、拼多多等等一线大厂!

三十而立

运维审计录像的作用是什么?用什么软件好?

行云管家

堡垒机 运维审计 审计录像

白嫖!字节跳动 Java岗顶级面试解析(2023版),GitHub巅峰神作!

三十而立

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年3月刊

墨天轮

MySQL 数据库 oracle postgresql 国产数据库

2023 Java面试题短期突击攻略,已帮助400+位程序员成功拿到offer

小小怪下士

Java 程序员 面试 后端

升级企业数智化底座,以技术重构企业发展力

用友BIP

技术大会 用友iuap 用友BIP 用友技术大会

云服务是什么意思?有什么用?

行云管家

云计算 云服务

技术分享 | 如何迅速将分布式政企应用转型为云原生微服务架构

IT科技苏辞

2023 寻找企业出海“新势力”

Jessie

企业出海 出海

仅凭这份 Java 大纲笔记,我如愿拿到了阿里 offer。

三十而立

Mysql分页 vs Oracle分页|非常详细,建议收藏

bug菌

MySQL oracle 三周年连更

五一临近,赋能乡村振兴,低代码也有话讲!

加入高科技仿生人

低代码 数字化 乡村振兴 乡村旅游

600+ 道 Java面试题及答案整理(建议收藏)

会踢球的程序源

Java 面试 java面试 应届生 Java八股文

用低代码平台可视化设计表单

力软低代码开发平台

爆肝一月!527页文档详解SpringCloud微服务和分布式系统实践

Java你猿哥

数据库 分布式 SSM框架 微服务设计

华为云智能编程助手赋能高校,揭示行业发展新动向

爱尚科技

华为云智能编程助手助力哈尔滨工业大学(深圳)培养新时代软件研发人才

爱尚科技

华为云智能编程助手助力哈尔滨工业大学(深圳)学子,引领软件研发新趋势

爱尚科技

搭建数据驱动的技术底座,助力企业数智化变革

用友BIP

技术大会 用友iuap 用友技术大会 升级企业数智化底座

selenium源码通读·6 |webdriver/common/alert.py-Alert类分析

Python 源码 自动化测试 selenium

SOA/ESB架构升级之路:从微服务到ServiceMesh,再到Sermant

IT科技苏辞

崖山科技通过CMMI3级认证,研发管理能力获国际权威认可!

YashanDB

使用事件模型定制Grails应用的行为_Java_Srini Penchikala_InfoQ精选文章