Spring 全家桶火遍大江南北,兄弟产品 Grails 国内却依旧冷清

偶然要帮忙做次 Grails 面试,回味遍久别的 Grails,曾经对它也是无限热爱,不过后来投入 Spring 全家桶门下,今天就简单分享一下 Grails。

Grails
是一个开源的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逻辑、简单页面和单元测试。


下面以实际的Demo介绍一些特性。

简单的MVC分层

采用MVC三层,下面是项目的默认目录结构,理解简单。

controllers、views、services
三层。

├── assets

├── conf

├── controllers

├── domain

├── i18n

├── init

├── services

├── taglib

├── utils

└── views

约定优于配置



Controller
为例,不用做任何配置,Controller 下的函数(

action
) 自动暴露对外访问。

class UserController {

    def list() {

        def userId = params.id

        def data = [userId: userId, name: "kitty"]

        render data as JSON

    }

}

访问示例:

curl --location --request 

GET 'http://localhost:8080/user/list?id=1'

Groovy 的魅力

Groovy 作为动态语言且拥有很多高级特性,开发非常高效。

  • 在应用运行期间直接开发,即时编译,可以和前端开发一样立马看到效果,不用重启应用
File ...controllers/UserController.groovy changed, recompiling...

Grails application running at http://localhost:8080 in environment: development

  • 很早就拥有 Java8

    lambda表达式、函数式编程
    等类似特性

  • 语法兼容Java,会Java则可以使用 Groovy
  • 有着ES6+的编程舒适感
// 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演示。

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操作。

// 新增并保存对象, 更新同操作

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 友好的提示:

丰富的插件

Grails 有着丰富的插件(1000+),常用工具都能找到,也可以引入Maven依赖。插件既可以是普通的工具组件,也可以是模块化的应用,插件可以是前端组件,也可以是后端组件。

下面是

AdminLTE UI
插件。

灵活的视图层

自研的GSP(Groovy Servers Pages)技术用于展示层,类似于JSP,但使用更便利。

例如,在接口中直接返回

book
对象。

def show() {

    [book: Book.get(params.id)]

}



.gsp
页面中,可以直接使用:

${book.title}

和JSP类似,提供了大量的标签。

<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


  • 国内较冷,不好找工作