Groovy零基础入门学习

悲剧样本 发表于:2018-09-08 10:56 阅读: 169次

这篇文章主要介绍了Groovy基础入门知识,结合实例讲解了Groovy开发环境搭建,基础语法,常见使用场景和与Spring的整合。需要的朋友可以参考下。

Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)。并且,Groovy 可以与 Java 语言无缝对接,在写 Groovy 的时候如果忘记了语法可以直接按Java的语法继续写,也可以在 Java 中调用 Groovy 脚本,都可以很好的工作,这有效的降低了 Java 开发者学习 Groovy 的成本。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。

开发环境搭建

使用Maven构建项目

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> 
<groupId>com.vs</groupId> 
<artifactId>com.vs.maven.gradle</artifactId> 
<version>1.0</version> 

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.2.6.RELEASE</version> 
</parent> 
<dependencies> 
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa </artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> 
<build> 
<plugins> 
<plugin> <groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-maven-plugin</artifactId> </plugin> 
</plugins> 
</build> 
</project>

1.下载Groovy开发工具包(GDK)
http://www.groovy-lang.org/download.html

2.创建Groovy项目
使用IDEA的话需要安装Groovy的支持插件,安装完成后在新建项目中便会出现Groovy项目选项,选择Groovy项目并关联Groovy libray即可,当然也可以直接创建.groovy文件用命令行直接运行。

3.Hello World
在Java中要输出“hello world”需要像下面这样,创建一个类,然后创建一个main方法。

System.out.println("hello world");
System.out.println "hello world";

println("hello world")
println 'hello world'

在Groovy中,这些都可以省略,下面这4种方式都可以输出“hello world”。

如果 Groovy 脚本文件里只有执行代码,没有类的定义,则 Groovy 编译器会生成一个 Script 的子类,类名和脚本文件的文件名一样,而脚本中的代码会被包含在一个名为run的方法中,同时还会生成一个main方法,作为整个脚本的入口。所以,作为 JVM 平台语言,与 Java 本质上还是一样的。

注意:Groovy 会默认导入下面这些包、类,不需要像JAVA一样使用import语句显式导入。

java.io.*
java.lang.*
java.math.BigDecimal
java.math.BigInteger
java.net.*
java.util.*
groovy.lang.*
groovy.util.*

多重方法

在 Groovy 中,调用的方法将在运行时被选择。这种机制被称为运行时分派或多重方法(multi-methods),是根据运行时实参(argument)的类型来选择方法。Java 采用的是相反的策略:编译时根据声明的类型来选择方法。

下面是一个例子,同样的 Java 代码在 Java 和 Groovy 环境中运行结果是不同的.

int method(String arg) { return 1; }
int method(Object arg) { return 2; }
Object o = "Object"; int result = method(o);
// In Java
assertEquals(2, result);
// In Groovy
assertEquals(1, result);

产生差异的原因在于,Java 使用静态数据类型,o 被声明为 Object 对象,而 Groovy 会在运行时实际调用方法时进行选择。因为调用的是 String 类型的对象,所以自然调用 String 版本的方法。

数组初始化语法

在 Groovy 中,{…} 语句块是留给闭包(Closure)使用的,所以不能像 Java 中一样使用下面这种方式初始化数组

对象封装

Groovy 默认会隐式的创建getter、setter方法,并且会提供带参的构造器,下面两者是等价的。

// In Java public class Person { 
private String name;
Person(String name) {
this.name = name
}
public String getName() { return name } 
public void setName(String name) { this.name = name } 
}
// In Groovy 
class Person { String name } 
def person = new Person(name: '张三') 
assert '张三' == person.name person.name = '李四' 
//person.setName('李四')
 assert '李四' == person.getName()

包访问权限

在 Java 中如果没有显式的指定访问修饰符(public、protected、private)那么默认是包访问权限,但在 Groovy 中默认是public的,所以需要使用@PackageScope注解。

class Person {
    @PackageScope String name
}

ARM 语句块

ARM(Automatic Resource Management,自动资源管理)语句块(或者叫TWR语法)从 Java 7 开始引入,用于降低IO操作代码的复杂度,但 Groovy 并不支持。相反,Groovy 提供多种基于闭包的方法,不但可以达到同样的效果并且会更加简洁优美。

内部类

Groovy 同样支持内部类并且实现跟 Java 是一样的,但不应拿 Java 语言规范来考量它,应对差异情况保持冷静与宽容(keep shaking the head about things that are different)。在Groovy中内部类看起来有点类似 groovy.lang.Closure 类的实现。

GString

由于双引号所包括起来的字符串字面量会被解释为 GString 值(即 “Groovy 字符串”的简称),所以如果当某个类中的 String 字面量含有美元字符($)时,那么利用 Groovy 和 Java 编译器进行编译时,Groovy 很可能就会编译失败,或者产生与 Java 编译所不同的结果。

通常,如果某个 API 声明了形参的类型,Groovy 会自动转换 GString 和 String。要小心那些形参为 Object 的 Java API,需要检查它们的实际类型。

字符串和字符字面量

在 Groovy 中,由单引号所创建的字面量属于 String 类型对象,而双引号创建的字面量则可能是 String 或 GString 对象,具体分类由字面量中是否有插值来决定。

assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString

基础语法

Groovy 语句无需使用分号(;)结尾,当然加上也不会报错,毕竟完全兼容 Java 的语法。
Groovy 中==等价于 Java 中的equals方法。

注释和 Java 一样,支持单行(//)、多行(/ /)和文档注释(/* /)

变量

Groovy 中定义变量默认访问修饰符是public,变量定义时遵循 Java 变量命名规范,变量名以字母、下划线或美元符号$开始,可以包含字母、数字、下划线和美元符号$,但关键字除外。除了这些规则之外,Groovy 定义变量时如果是一行定义一个类型,末尾的分号可以省略,但是如果多个变量占一行,变量之间必须以分号分割。

Groovy 定义变量的方式和 Java 是类似的,区别在于 Groovy 提供了def关键字供使用,它可以省略变量类型的定义,根据变量的值进行类型推导。

def a = 123
def b = 'b'
def c = true 
boolean d = false
int e = 123

如果定义变量的字面量值为数字时,类型会根据数字的大小自动调整

def a = 1 
assert a instanceof Integer 
// Integer.MAX_VALUE 
def b = 2147483647 
assert b instanceof Integer 

// Integer.MAX_VALUE + 1 
def c = 2147483648 
assert c instanceof Long 

// Long.MAX_VALUE 

def d = 9223372036854775807 
assert d instanceof Long 

// Long.MAX_VALUE + 1 

def e = 9223372036854775808 
assert e instanceof BigInteger

字符串

在Groovy种有两种字符串类型,普通字符串(java.lang.String)和插值字符串(groovy.lang.GString)。
普通字符串使用单引号,插值字符串使用双引号。除此之外,还支持三单引号的写法,可以保留文本的换行及缩进格式:

方法(函数)

Groovy 方法的默认访问修饰符是public,方法的返回类型可以不需要声明,但需添加def关键字。有返回值的方法return可以被省略,默认返回最后一行代码的运行结果,如果使用了return关键字则返回指定的返回值。Groovy 方法的参数类型可以被省略,默认为Object类型。Groovy 方法的其他特性与Java一样,比如支持重载、不定长参数(…)等。

常见使用场景

Grails

Grails 是一个基于 Groovy 语言,构建于 Spring/Spring Boot、Hibernate 之上的高生产力、一站式 Web 开发框架。特别适合小型团队进行敏捷开发,效率非常高。由于性能和学习成本的原因,普及率比较低,大分部公司还是更倾向于选择 Spring Boot 作为开发框架。

Gradle

Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。它使用一种基于 Groovy 的特定领域语言(DSL)来进行构建配置,抛弃了基于XML的各种繁琐配置,主要以面向Java应用为主,支持从 Maven 仓库下载依赖。现在越来越多的项目(Android项目居多)使用Gradle 来作为项目的构建工具,相信未来 Gradle 也会逐渐代替 Maven,就像 Maven 代替 Ant 那样。

Spring整合

从 Spring 2.0 版本开始对动态脚本语言进行了支持(Spring 官方文档该部分地址),其中便包括 Groovy ,Spring 提供了<lang:groovy/>标签来定义 Groovy Bean 。Groovy Bean 可以通过script-source属性加载脚本文件,脚本源文件可以来自本地或者网络,并且可以通过refresh-check-delay属性监听脚本内代码变更重新装载 Bean 实现动态 Bean 。从 Spring 4.0 版本开始 Spring 支持使用 Groovy DSL 来定义 Bean 的配置。

SPRING官方对动态语言的支持用法详情:https://docs.spring.io/spring/docs/4.3.12.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#dynamic-language-beans

本文到这里就结束了,希望可以对大家的学习入门有帮助。

酷码派 [KuMaPai.COM] - 陕ICP备案证 18010024号-2