QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

使用事件模型定制 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:34783
用户头像

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

关注

评论

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

外包管理战略:解锁高效团队协作的关键

测吧(北京)科技有限公司

测试

10个React状态管理库推荐

伤感汤姆布利柏

SD-WAN的突出作用

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

高效集成|聚道云软件连接器实现薪人薪事与每刻报销无缝对接

聚道云软件连接器

案例分享

2024最新一期中国数据库流行榜公布:阿里云PolarDB登顶

阿里云瑶池数据库

数据库 云计算 阿里云 云原生 polarDB

服务器C盘突然满了,是什么问题

德迅云安全杨德俊

唯品会商品详情数据接口Python

tbapi

唯品会API接口 唯品会商品数据接口 唯品会商品详情数据接口

物联网浏览器(IoTBrowser)-Modbus协议集成和测试

快乐非自愿限量之名

浏览器 物联网 项目开发

【教程】苹果上架常见要求的有哪些?

深度解析:i++ 与 ++i,探究其性能差异与使用技巧

高端章鱼哥

i++ i

空降领导的智慧:与老员工相处与快速团队信任的建立

测吧(北京)科技有限公司

测试

建立团队信任与凝聚力的六大实用方法

测吧(北京)科技有限公司

测试

28图图解Raft协议,so easy~~

快乐非自愿限量之名

Java 前端 开发 服务器 raft

TDengine 3.0 四大企业应用案例合集,给你最直观的应用体验

TDengine

tdengine 时序数据库

为什么Nginx被称为“反向”代理呢?

互联网工科生

服务器 ​Nginx

初次承担管理的成功领导力建立

测吧(北京)科技有限公司

测试

利用 ASP.NET Core 开发单机应用

不在线第一只蜗牛

.net 架构 分布式 微服务

云原生与低代码:加速提效,为行业拓荒期构建生态

不在线第一只蜗牛

云计算 云原生 低代码

纯血鸿蒙来了,鸿蒙App开发有可能提速吗?

FinFish

鸿蒙系统 小程序化 小程序技术 鸿蒙Next 纯血鸿蒙

BRC20支持的Dapp:开创去中心化应用的未来

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

常见的企业网络问题及SD-WAN解决方案

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

低代码:数字化转型的助推器

EquatorCoco

低代码 数字化 数字转型

京东商品详情数据接口(app)Python

tbapi

京东API接口 京东商品详情接口 京东商品数据采集

JNPF低代码平台存在的价值

高端章鱼哥

软件开发 低代码 JNPF

SD-WAN和MPLS的区别以及如何选择?

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

云原生时代下,操作系统生态的挑战与机遇

OpenAnolis小助手

云计算 云原生 操作系统 龙蜥社区 蚂蚁集团

什么是信创业态支持?支持信创的数据库防水坝哪家好?

行云管家

数据库 信创 堡垒机 国产化 数据库防水坝

《实现领域驱动设计》- 领域服务

EquatorCoco

DDD 项目开发

简论密码登录安全性

Geek_44385e

登录 密码安全

每日一题:LeetCode-958. 二叉树的完全性检验

Geek_4z9ami

面试 算法 LeetCode 二叉树 BFS

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