第二十九章:基于SpringBoot平台使用Lombok来优雅的编码

Lombok对于Java偷懒开发者来说应该是比较中意的,恰恰笔者就是一个喜欢在小细节上偷懒来提高开发效率的人。所以在技术框架的海洋里寻找了很久才在GitHub开源平台上找到,而在这之前国外很多程序猿一直使用该框架了,Lombok框架提供了很多编码遍历,但是也降低了代码的阅读力。下面我们看看在Idea开发工具中该怎么使用Lombok

本章目标

使用Lombok提高开发效率。

SpringBoot 企业级核心技术学习专题

专题

专题名称

专题描述

001

Spring Boot 核心技术

讲解SpringBoot一些企业级层面的核心组件

002

Spring Boot 核心技术章节源码

Spring Boot 核心技术简书每一篇文章码云对应源码

003

Spring Cloud 核心技术

对Spring Cloud核心技术全面讲解

004

Spring Cloud 核心技术章节源码

Spring Cloud 核心技术简书每一篇文章对应源码

005

QueryDSL 核心技术

全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA

006

SpringDataJPA 核心技术

全面讲解SpringDataJPA核心技术

构建项目

本章的项目不涉及数据访问,所以添加的依赖也比较少,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.yuqiyu</groupId>
    <artifactId>chapter29</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>chapter29</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.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>
        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </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>
        </plugins>
    </build>
</project>

lombok的依赖仅仅只有一个,lombok基于配置在编译class文件时会自动将指定模板的内容写入。

创建实体

为了方便演示lombok的神奇之处,我们简单创建一个用户实体,基于该实体进行配置lombok注解,实体代码如下所示:

package com.yuqiyu.chapter29.bean;

/**
 * 用户实体>>>测试lombok
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/8/4
 * Time:23:07
 * 码云:http://git.oschina.net/jnyqy
 * ========================
 */
public class UserBean
{
    //名称
    private String name;
    //年龄
    private int age;
    //家庭住址
    private String address;
}

下面我们先来看看我们最常用的getter/setter基于lombok如何使用。

Getter/Setter

Getter/Setter注解作用域可以是实体类也可以是具体的属性字段,下面我们仅仅对name属性添加注解,代码如下所示:

    //...省略
    //名称
    @Getter
    @Setter
    private String name;

如果想让lombok生效我们还需要针对idea工具进行插件的安装,下面我们按照顺序打开Idea配置File > Settings > Plugins > Browse repositories... > 输入lombok,插件就会被自动检索出来,界面如下图1所示:

图1

我的工具已经安装了该插件,所有在右侧是没有任何按钮的,如果你的工具没有安装该插件,右侧会有一个绿色的按钮,按钮的内容则是Install,点击安装后重启Idea就可以了。 为了方便我们直接使用SpringBoot项目为我们创建的测试类(位置:com.yuqiyu.chapter29.Chapter29ApplicationTests)来验证我们的lombok注解是否已经生效,测试类代码如下所示:

package com.yuqiyu.chapter29;

import com.yuqiyu.chapter29.bean.UserBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
//@RunWith(SpringRunner.class)
//@SpringBootTest
public class Chapter29ApplicationTests {

    @Test
    public void testLombok()
    {
        //测试Getter/Setter
        UserBean user = new UserBean();
        user.setName("测试lombok");
        System.out.println(user.getName());
    }
}

可以看到我们可以正常使用name属性的getter/setter方法,但是其他属性的却是无法调用,下面我们修改注解Getter/Setter位置,配置到实体类上。修改后的代码如下所示:

//省略...
@Getter
@Setter
public class UserBean
{
    //名称
    private String name;
    //年龄
    private int age;
    //家庭住址
    private String address;
}

我们再来测试下其他属性是否可以访问到了,测试类修改代码如下所示:

//省略...
@Test
    public void testLombok()
    {
        //测试Getter/Setter
        UserBean user = new UserBean();
        user.setName("测试lombok");
        user.setAge(10);
        user.setAddress("测试地址");

        System.out.println(user.getName()+"  " + user.getAge() +"  "+user.getAddress());
    }

可以看到我们修改配置位置后UserBean实体内的所有属性都具备了Getter/Setter方法,这样我们在开发中就不需要再去做多余的生成操作了。

注意:如果你的属性Getter/Setter需要做特殊处理,那么直接使用原始方法实现即可,Lombok检查到存在自定义的方法后不会再做生成处理。

ToString

除了上述的Getter/SetterLombok还为我们提供了自动生成toString方法的注解@ToString,该注解的作用域仅仅是在实体类上,我们修改实体类添加该注解,在测试类中调用toString方法查看输出内容如下:

System.out.println(user.toString());
//输出:
UserBean(name=测试lombok, age=10, address=sss测试地址)

Lombok自动创建的toString方法会将所有的属性都包含并且调用后可以输出。

AllArgsConstructor

Lombok还提供了全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,因为只有实体类才会存在构造函数。修改添加该注解并且测试调用,如下所示:

UserBean u = new UserBean("构造lombok",1,"测试地址");
//输出:
UserBean(name=构造lombok, age=1, address=sss测试地址)

注意:该注解配置后会自动生成一个具体全部参数的构造函数,参数的顺序与属性定义的顺序一致。

NoArgsConstructor

当然除了全部参数的构造函数,Lombok还提供了没有参数的构造函数,使用方式与@AllArgsConstructor一致。

到这里也许你就有疑问了,我为了一个类添加这么多注解麻烦吗?还不如工具生成getter/setter来的快呢,那好Lombok针对这个问题也做出了解决方案。

Data

我们使用@Data注解就可以涵盖@ToString@Getter@Setter方法,当然我们使用构造函数时还是需要单独添加注解,下面我们修改实体类添加@Data注解代码如下所示:

/*@Getter
@Setter
@ToString*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserBean
{
    //名称
    private String name;
    //年龄
    private int age;
    //家庭住址
    private String address;

    public String getAddress() {
        return "sss"+address;
    }
}

我们将@ToString@Getter@Setter三个注解注释掉后添加@Data,按照官方所说这时我们的测试类应该不会出现任何的异常,我们打开测试类查看是否正常。 查看后果然,没有出现任何的异常,这也说明了@Data注解确实涵盖了上面三个注解。

Slf4j

还有一个利器,Lombok为我们内置了各种日志组件的支持,我们在SpringBoot项目开发中几乎都是使用logback作为日志组件,而logback是基于slf4j完成的。所以我们在实体类上直接添加@Slf4j就可以自动创建一个日志对象作为类内全局字段,自动创建的代码如下所示:

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Chapter29ApplicationTests.class);

为了测试我在Chapter29ApplicationTests测试类上添加了@Slf4j,调用效果如下所示:

//调用:
log.info(u.toString());
//输出:
23:55:46.100 [main] INFO com.yuqiyu.chapter29.Chapter29ApplicationTests - UserBean(name=构造lombok, age=1, address=sss测试地址)

总结

以上内容就是本章的全部讲述,本章主要讲解Lombok用于便于开发的注解组件。Lombok虽然提供的组件不多,但是每一个都是我们需要的,正是因为如此从而大大减少了我们的工作量,尤其是这种不起眼却又不得不写的代码。Lombok官方文档地址

本章代码已经上传到码云: SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter SpringBoot相关系列文章请访问:目录:SpringBoot学习目录 QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录 SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录 感谢阅读!

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

看我如何利用漏洞窃取麦当劳网站注册用户密码

本文讲述了利用不安全的加密存储(Insecure_Cryptographic_Storage)漏洞和服务端反射型XSS漏洞,实现对麦当劳网站(McDonalds...

1906
来自专栏ITCloud的专栏

RBD至FileStore之所见(原理篇)

前言 我们知道,FileStore是目前Ceph版本的默认存储方式(后续社区准备采用BlueStore)。 RDB是我们虚拟机使用Ceph的常用方式,Ceph...

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

Web-第二十天 Redis学习【悟空教程】

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686

835
来自专栏SDNLAB

OpenvSwitch系列之浅析main函数

通过前面几篇解析OpenvSwitch内部主要数据结构和流程,对OpenvSwitch有了相对简单的了解,由于本人不是专业搞OpenvSwitch的,纯属业余爱...

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

Web-第三十一天 WebService学习【悟空教程】

简单的网络应用使用单一语言写成,它的唯一外部程序就是它所依赖的数据库。大家想想是不是这样呢?

1204
来自专栏蓝天

squid配合nginx的gzip压缩的完美解决方案

Squid3.0之前,一直不能完美支持http1.1。所以对gzip内容的支持,始终有很多问题。我也看过很多帖子,号称解决了这个问题。但是其实一直没有把问题说清...

782
来自专栏武军超python专栏

2018年8月16日多线程并发和队列

静态文件的打包:静态文件包括图片,视频等静态的文件 MANIFEST.in include  如果要打包静态文件,定义MANIFEST.in配置文件

906
来自专栏pangguoming

Dropwizard框架入门

最近项目用到了Dropwizard框架,个人感觉还不错,那么这里就从他们官网入手,然后加上自己的实现步骤让大家初步了解这个框架。 官网对DW(Dropwizar...

4744
来自专栏性能与架构

Redis 优化执行命令的延时

Redis 是单线程的,客户端的命令请求在server中会被排队,按照顺序处理,如果队列长,命令执行结果的响应时间便会长 ? 如果客户端想要快点得到执行结果,可...

4476
来自专栏Java3y

SpringBoot就是这么简单

s一、SpringBoot入门 今天在慕课网中看见了Spring Boot这么一个教程,这个Spring Boot作为JavaWeb的学习者肯定至少会听过,但我...

2918

扫码关注云+社区