美文网首页
Lombok是什么

Lombok是什么

作者: zhangxu0636 | 来源:发表于2019-06-11 21:56 被阅读0次

    1.为什么会有Lombok,解决了什么痛点

    最近在学习spring boot的时候发现spring boot里面有推荐使用lombok,现在就写一下最近的学习心得。lombok让代码变得更加简洁,省去了一些繁琐的操作,比如设置get set方法,添加构造方法,打印日志等等。

    2.给ide安装Lombok插件。

    我这里选择的是idea.在idea的插件库中搜索Lombok,选择下载量最多的就可以了。


    lombok插件.png

    3.原理

    首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。

    4.如何使用

    4.1加入依赖

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.18</version>
        <scope>provided</scope>
    </dependency>
    

    4.2 @Data

    注解在类上,自动生成了get set方法,还有equals,hashCode, toString等方法, 下载完成以后重启idea就可以了。

    编译前

    package com.xuzhang.springboot.jpa.model;
    
    import lombok.Data;
    
    @Data
    public class User {
        private String name;
    }
    
    

    编译后:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.xuzhang.springboot.jpa.model;
    
    public class User {
        private String name;
    
        public User() {
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public boolean equals(Object o) {
            if (o == this) {
                return true;
            } else if (!(o instanceof User)) {
                return false;
            } else {
                User other = (User)o;
                if (!other.canEqual(this)) {
                    return false;
                } else {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name != null) {
                            return false;
                        }
                    } else if (!this$name.equals(other$name)) {
                        return false;
                    }
    
                    return true;
                }
            }
        }
    
        protected boolean canEqual(Object other) {
            return other instanceof User;
        }
    
        public int hashCode() {
            int PRIME = true;
            int result = 1;
            Object $name = this.getName();
            int result = result * 59 + ($name == null ? 43 : $name.hashCode());
            return result;
        }
    
        public String toString() {
            return "User(name=" + this.getName() + ")";
        }
    }
    
    

    4.3 @AllArgsConstructor

    提供所有参数的构造方法,不提供默认的无餐构造方法。

    编译前

    package com.xuzhang.springboot.jpa.model;
    
    import lombok.AllArgsConstructor;
    
    @AllArgsConstructor
    public class User {
        private String name;
        private int age;
    }
    

    编译后:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.xuzhang.springboot.jpa.model;
    
    public class User {
        private String name;
        private int age;
    
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
    

    4.4 @NoArgsConstructor

    上面说了@AllArgsConstructor会提供所有参数的构造方法,但不提供默认无参数的构造方法,所以就可以用到了@NoArgsConstructor

    编译前:

    package com.xuzhang.springboot.jpa.model;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private String name;
        private int age;
    }
    

    编译后:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.xuzhang.springboot.jpa.model;
    
    public class User {
        private String name;
        private int age;
    
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public User() {
        }
    }
    

    4.5 @Slf4j

    编译前

    package com.xuzhang.springboot.jpa.model;
    
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class User {
        private String name;
        private int age;
    
        private void test(){
            log.info("test");
        }
    }
    

    编译后:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.xuzhang.springboot.jpa.model;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class User {
        private static final Logger log = LoggerFactory.getLogger(User.class);
        private String name;
        private int age;
    
        public User() {
        }
    
        private void test() {
            log.info("test");
        }
    }
    
    

    总结

    上述的注解可以配合使用。暂时我最常用的注解就是这些,后续如果还用到别的注解,再来更新。

    相关文章

      网友评论

          本文标题:Lombok是什么

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