通过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}")

输出结果为:

image

由于在第一个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!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏osc同步分享-java技术分享站

springmvc 其他

<!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-contr...

36480
来自专栏从零开始的linux

rename命令

rename命令用字符串替换的方式批量改变文件名 语法: rename(参数) 参数: 原字符串:将文件名需要替换的字符串,必须得是确定的字符,如果写*,可能会...

383100
来自专栏码匠的流水账

聊聊kafka consumer offset lag的监控

在0.8.2.2版本如下 kafka_2.10-0.8.2.2-sources.jar!/kafka/tools/ConsumerOffsetChecker.s...

39710
来自专栏码匠的流水账

springboot中使用esper入门

esper是一个比较经典的CEP(Complex Event Processing)的开源实现(开源协议为GPL v2),这里简单介绍下如何在springboo...

25410
来自专栏蓝天

标准没有规定C/C++表达式求值顺序

对于表达式,标准并没有规定计算顺序,所以下列代码的运行结果存在多样性:

9420
来自专栏Google Dart

为控制器配置日期处理 原

6410
来自专栏乐享123

Javascript设计模式 - 笔记2

13850
来自专栏cloudskyme

jbpm5.1介绍(7)

Junit测试评估流程 评估流程的界面如下: ? 这个示例里边用到了Script Task,Service Task和User Task Log执行记录日志的...

424110
来自专栏用户2442861的专栏

HttpEntity的类型及其使用

  代表底层流的基本实体。通常是在http报文中获取的实体。他只有一个空参的构造方法。刚创建时没有内容,长度为负值。需要通过两个方法,把值赋进去。

1.2K10
来自专栏Java帮帮-微信公众号-技术文章全总结

Spring-IOC(2)

scope <!--Spring使用scope标签来制定bean的作用域(默认为Singleton)--> <bean id="singletonBean" c...

351100

扫码关注云+社区

领取腾讯云代金券