通過Groovy來消除代碼噪聲
通過Groovy來消除代碼噪聲
Java是在JVM上運行的最廣泛使用的編程語言。不過,還有很多其他基於JVM的語言,比如Groovy,Scala,JRuby,Jython,Kotlin等等。其中,Groovy和Scala現在在Java社區中已經被廣泛采用並大受歡迎。 本文介紹如何在Spring Boo中使用Groovy語言來編程。
Groovy
Groovy是一種基於Java的語法的基於JVM的編程語言。Groovy支持動態輸入,閉包,元編程,運算符重載等等語法。除此之外,Groovy還提供了許多類似腳本語言的功能,比如,多行字符串,字符串插值,優雅的循環結構和簡單的屬性訪問。另外,結尾分號是可選的。而這些都有足夠的理幫助開發人員為了提高開發效率。
換句話說,Groovy就是一種繼承了動態語言的優良特性並運行在JVM上的編程語言。由於Groovy的語法非常接近Java,所以Java開發人員很容易開始使用Groovy。 Spring Boot應用中也支持使用Groovy編程語言進行開發。
Groovy字符串
我們可以使用單引號或雙引號在Groovy中創建字符串。當使用單引號時,字符串被看作為java.lang.String的一個實例,而當使用雙引號時,它被會被看為groovy.lang.Gstring的一個實例,支持字符串變量值。
def name = "zhangsan" def amount = 120 println('My name is ${name}') println("My name is ${name}") println("He paid \$${amount}") def age = 20 print("Her age is ${age}")
輸出結果為:
由於在第一個println()語句中使用單引號,所以,$會按原樣打印,而在第二個()語句中使用雙引號,則會打印變量值。如果需要打印?{name}會按原樣打印,而在第二個println()語句中使用雙引號,則會打印變量值。如果需要打印$符號,則需要還是用轉義字符?。並且,Groovy還支持使用三個引號(“”“或”’“)的多行字符串,如下所示:
//使用單引號 def content = '''My Name is zhangsan. I live in china. I am a software developer''' def name1 = 'zhangsan' def address = 'china' def occupation = 'software developer' //使用雙引號 def bio = """My name is ${name1}. I live in ${address}. I am a ${occupation}."""
Groovy在多行創建跨越一行的字符串時非常方便,比如,表格,帶占位符的HTML模板等。
POJO屬性
在Java中,一般是通過為這些屬性創建私有屬性和getter、setter方法來獲取和創建Bean。 雖然我們可以使用IDE生成setter和getter,但還是稍微有點繁雜,特別是增刪改屬性後。
而在Groovy中,我們直接通過聲明屬性來創建bean,然後使用object.propertyName
語法訪問它們,而無需創建setter和getters。如下代碼片段:
package com.groovydemo.groovy.entity
class Stu {
Integer id;
String name;
Integer age;
}
在這裏,我們可以看到值直接被分配給了Bean的屬性,比如 p.id = 1,而不需要為id創建setter。 同樣,可以使用p.id讀取屬性ID,而不需要獲取id的getter。 因為Groovy會默認將為這些屬性生成setter和getters,省去手動的get和set操作。
循環語法
除了常規while和for循環之外,Groovy還支持各種循環結構。比如,使用範圍運算符(..)
進行叠代,如下例子:
1、常規for用法:
for(i in 0..5) { print "${i}" }1
輸出:
0 1 2 3 4 5
2、使用upto()的來確定下限和上限:
0.upto(3) { print "$it " }1
輸出:
0 1 2 3
3、使用times()從0開始叠代:
5.times { print "$it " }1
輸出:
0 1 2 3 4
4、使用step()的下限和上限,來叠代並使用步長值:
0.step(10, 2) { print "$it "}1
輸出:
0 2 4 6 8
實戰:在Spring Boot中使用Groovy
我們可以使用IDE,也可以使用在線Spring Boot應用程序生成器http://start.spring.io創建應用,並選擇Groovy作為編程語言。
以Maven構建工具為例,使用插件:gmavenplus-plugin
編譯Groovy代碼。如下代碼所示。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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</groupId>
<artifactId>groovy-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>groovy-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- groovy -->
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>addSources</goal>
<goal>addTestSources</goal>
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>testGenerateStubs</goal>
<goal>testCompile</goal>
<goal>removeStubs</goal>
<goal>removeTestStubs</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Stu:
package com.groovydemo.groovy.entity
class Stu {
Integer id;
String name;
Integer age;
}
StuController:
package com.groovydemo.groovy.controller
import com.groovydemo.groovy.entity.Stu
import com.groovydemo.groovy.service.StuService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("Stu")
class StuController {
@Autowired
private StuService service;
@GetMapping("/test")
String test(){
Stu stu = service.getStuByid(1);
return "Ok==>You can use groovy!";
}
}
StuService:
package com.groovydemo.groovy.service
import com.groovydemo.groovy.entity.Stu
interface StuService {
Stu getStuByid(int i)
}
StuServiceImpl:
package com.groovydemo.groovy.service.impl
import com.groovydemo.groovy.entity.Stu
import com.groovydemo.groovy.service.StuService
import org.springframework.stereotype.Service
@Service
class StuServiceImpl implements StuService {
@Override
Stu getStuByid(int i) {
Stu stu = new Stu();
stu.setId(1);
stu.setName("zhangsan");
stu.setAge(18);
return stu;
}
}
RunAppGroovy:
package com.groovydemo
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
class RunAppGroovy {
static void main(String[] args) {
SpringApplication.run RunAppGroovy,args
}
}
訪問:http://localhost:8080/Stu/test
結果如下:
Ok==>You can use groovy!
通過Groovy來消除代碼噪聲