第二十九章:基于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 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2687
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2622
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4828
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2625
来自专栏魂祭心

原 canvas绘制clock

4034
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6668
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

30810
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2132
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2938
来自专栏杨龙飞前端

scrollto 到指定位置

2494

扫码关注云+社区