陈同学
微服务
Accelerator
About
# Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清 偶然要帮忙做次 Grails 面试,回味遍久别的 Grails,曾经对它也是无限热爱,不过后来投入 Spring 全家桶门下,今天就简单分享一下 Grails。 [Grails](https://grails.org/) 是一个开源的Web框架,旨在简化Web应用开发,提供全栈开发能力,自 **2009** 年以来已有十年历史。 它由 Spring全家桶所属公司 **Pivotal** 出品,在国外应用广泛,国内相对较少。 秉承着 "**约定优于配置(Convention Over Configuration)**"、**"Don’t Repeat Yourself"** 理念,在曾经开发人员呕吐着与漫天飞舞的配置信息做斗争的时代,Grails 真是让人眼前一亮、激动难安。后来,Spring Boot 打破了宁静,微服务的加持,又是另一番景象了。 Grails 采用动态语言 Groovy, 优雅高效,当前应用框架已基于 Spring Boot 之上,前端除自带的视图层技术GSP外,亦支持 Angular、React、Vue等。利用Grails可以快速搭建Web应用。 下面是个Demo,通过简单的领域类 `User`,利用脚手架工具就可以一键创建简单CRUD逻辑、简单页面和单元测试。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/05/14/5.png) 下面以实际的Demo介绍一些特性。 ## 简单的MVC分层 采用MVC三层,下面是项目的默认目录结构,理解简单。`controllers、views、services` 三层。 ``` ├── assets ├── conf ├── controllers ├── domain ├── i18n ├── init ├── services ├── taglib ├── utils └── views ``` ## 约定优于配置 以 `Controller` 为例,不用做任何配置,Controller 下的函数(`action`) 自动暴露对外访问。 ```java class UserController { def list() { def userId = params.id def data = [userId: userId, name: "kitty"] render data as JSON } } ``` 访问示例: ```curl curl --location --request GET 'http://localhost:8080/user/list?id=1' ``` ## Groovy 的魅力 Groovy 作为动态语言且拥有很多高级特性,开发非常高效。 * 在应用运行期间直接开发,即时编译,可以和前端开发一样立马看到效果,不用重启应用 ```java File ...controllers/UserController.groovy changed, recompiling... Grails application running at http://localhost:8080 in environment: development ``` * 很早就拥有 Java8 `lambda表达式、函数式编程` 等类似特性 * 语法兼容Java,会Java则可以使用 Groovy * 有着ES6+的编程舒适感 ```groovy // List 定义与遍历, 常见聚合操作支持 def list = [1, 2, 3, 4] list.each { print it } list.sum() // Map 定义与遍历 def map = [name: "hello", value: "grails"] map.each { println it.key + ":" + it.value } // 在函数内可直接定义函数并使用, 也可以把函数作为参数传递 def add = { num -> return ++num } println add(1) ``` ## 强大的 GORM 持久层 GORM 基于 Hibernate,拥有多种查询方式,使用非常简单,下面以 User Domain演示。 ```groovy class User { Long id String name Integer age Long lastUpdatedBy // 丰富的字段约束限制 static constraints = { name(nullable: false) age(range: 0..150) } // 各类拦截操作, 全局或特定Domain都支持 def beforeUpdate() { lastUpdatedBy = -1 } } ``` 下面看看其CRUD,Domain类自带CRUD操作。 ```groovy // 新增并保存对象, 更新同操作 User user = new User() user.save() // 根据主键查记录, 查出来后为 readonly User.read(1) // 根据主键查记录, 查出来后可操作 User.get(1) // 锁住记录(DB锁) user.lock(1) // 删除记录 user.delete() // 多种查询方式 User.list() User.findAll { name == "kitty" } User.executeQuery("from User where 1=1") def query = User.where { name == "kitty" } query.find() def criteria = User.createCriteria() def results = criteria { between("age", 1, 20) eq("name", "kitty") like("name", "Fred%") order("name", "desc") } ``` IDEA 友好的提示: ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/05/14/2.png) ## 丰富的插件 Grails 有着丰富的插件(1000+),常用工具都能找到,也可以引入Maven依赖。插件既可以是普通的工具组件,也可以是模块化的应用,插件可以是前端组件,也可以是后端组件。 下面是 `AdminLTE UI` 插件。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2020/05/14/3.png) ## 灵活的视图层 自研的GSP(Groovy Servers Pages)技术用于展示层,类似于JSP,但使用更便利。 例如,在接口中直接返回 `book` 对象。 ```java def show() { [book: Book.get(params.id)] } ``` 在 `.gsp` 页面中,可以直接使用: ``` ${book.title} ``` 和JSP类似,提供了大量的标签。 ```html <g:if test="${flash.message}"> <div class="message" role="status">${flash.message}</div> </g:if> <f:table collection="${userList}" /> <div class="pagination"> <g:paginate total="${userCount ?: 0}" /> </div> ``` ## 不足 * 越简单,自然越重,开发时电脑资源消耗高。 * 打包后体积大,空项目达 `73M`,而 Spring Boot 空项目 `17M`。 * 国内较冷,不好找工作
本文由
cyj
创作,可自由转载、引用,但需署名作者且注明文章出处。
文章标题:
Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清
文章链接:
https://chenyongjun.vip/articles/157
扫码或搜索 cyjrun 关注微信公众号, 结伴学习, 一起努力