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
。
- 国内较冷,不好找工作