美文网首页Spring Boot 核心技术SpringBoot极简教程 · Spring Boot 后端相关
第二十九章:基于SpringBoot平台使用Lombok来优雅的

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

作者: 恒宇少年 | 来源:发表于2017-08-05 00:02 被阅读3577次

    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核心技术
    007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

    构建项目

    本章的项目不涉及数据访问,所以添加的依赖也比较少,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学习目录
    感谢阅读!

    相关文章

      网友评论

      • 咔dua翠嘞:居然贴代码了。。。
      • Xanthuim:突然觉得当注解越来越多的时候,整个页面就不再像当年的Java了(虽然注解也是Java的东西)。我突然明白了,为啥Kotlin能被大家接受,越来越烦Java了。。
      • 何何与呵呵呵:感觉还是鸡肋!
        牛逼的小伙子:@何何与呵呵 为啥呀?感觉不错

      本文标题:第二十九章:基于SpringBoot平台使用Lombok来优雅的

      本文链接:https://www.haomeiwen.com/subject/vigblxtx.html