spring-boot 之Lombok的使用,通过注解来省略一些常用代码,set get 日志等

如果使用IDEA要先安装lombok插件

三、注意:如果注解@Slf4j注入后找不到变量log,那就给IDE安装lombok插件,、 下面以idea为例

1、File  → settings →  Plugins,  然后点击“Browse repositories” 如图  

2、输入 lombok 搜索插件, 点install安装,安装完重启idea     这时候输入 log就可以有提示了

 

 

IDEA新建spring boot工程,选择Lombok

常用注解

  • @Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
  • @Setter :注解在属性上;为属性提供 setting 方法
  • @Setter :注解在属性上;为属性提供 getting 方法
  • @Slf4j:注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
  • @NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
  • @AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
  • @Cleanup : 可以关闭流
  • @Builder : 被注解的类加个构造者模式
  • @Synchronized : 加个同步锁
  • @SneakyThrows : 等同于try/catch 捕获异常
  • @NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
  • @Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。

@NonNull 判空处理

package com.yanjun.mybatis.bean;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;

@Data
@NoArgsConstructor
public class User {

    public Integer age;

    @NonNull
    public String name;

}

相当于

package com.yanjun.mybatis.bean;

import lombok.NonNull;

public class User {
    public Integer age;
    @NonNull
    public String name;

    public Integer getAge() {
        return this.age;
    }

    @NonNull
    public String getName() {
        return this.name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setName(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked @NonNull but is null");
        } else {
            this.name = name;
        }
    }
}

测试

User user = new User();
user.setName(null);

效果

Exception in thread "main" java.lang.NullPointerException: name is marked @NonNull but is null
    at com.yanjun.mybatis.bean.User.setName(User.java:7)
    at com.yanjun.mybatis.LombokApplication.main(LombokApplication.java:15)

@Data 提供 get、set 方法

package com.yanjun.mybatis.bean;

import lombok.Data;

@Data  //自动生成 get、set 方法
public class User {

    Integer id;

    String name;

    Integer age;


    public static void main(String[] args) {
        //测试方法
        User user = new User();
        user.setName("zhaoyanjun");
        user.setAge(20);
        user.setId(1);
    }

}

@Slf4j 日志打印

package com.yanjun.mybatis.bean;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data  //自动生成 get、set 方法
@Slf4j  //日志打印
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User();
        user.setName("zhaoyanjun");
        user.setAge(20);
        user.setId(1);

        log.info("日志" + user.toString());

    }
}

@AllArgsConstructor 全参数构造函数

package com.yanjun.mybatis.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data  //自动生成 get、set 方法
@AllArgsConstructor  //自动生成全参数构造函数
@Slf4j   //日志打印
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User(1, "zhaoyanjun", 20);

        log.info("日志" + user.toString());
    }
}

@ToString 自动生成toString方法

package com.yanjun.mybatis.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

@Data  //自动生成 get、set 方法
@AllArgsConstructor  //自动生成全参数构造函数
@Slf4j   //日志打印
@ToString(of = {"id","age"})  //tostring() 方法里面只打印 id ,name 字段
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User(1, "zhaoyanjun", 20);

        log.info("日志" + user.toString());
    }
}

toString() 方法排除字段

//排除字段
@ToString(exclude = {"name"})   //tostring() 方法中,name 字段不参与打印

@Value 用于注解final类

@Value 注解和@Data类似,区别在于它会把所有成员变量默认定义为 private final 修饰,并且不会生成set方法。

package com.yanjun.mybatis.bean;
import lombok.Value;

@Value
public class User {

    Integer id = 1;

    String name = "zhaoyanjun";

    Integer age  = 3 ;
}

编译后的代码

public final class User {
    private final Integer id = 1;
    private final String name = "zhaoyanjun";
    private final Integer age = 3;

    public User() {
    }

    public Integer getId() {
        return this.id;
    }

    public String getName() {
        this.getClass();
        return "zhaoyanjun";
    }

    public Integer getAge() {
        return this.age;
    }

    //省略部分代码
    ......
}

@Builder : 被注解的类加个构造者模式

import lombok.Builder;

@Builder
public class User {

    public Integer id;

    public String name;

    public Integer age;
}

相当于以下代码

package com.yanjun.mybatis.bean;

public class User {
    public Integer id;
    public String name;
    public Integer age;

    User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private Integer id;
        private String name;
        private Integer age;

        UserBuilder() {
        }

        public User.UserBuilder id(Integer id) {
            this.id = id;
            return this;
        }

        public User.UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public User.UserBuilder age(Integer age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(this.id, this.name, this.age);
        }

        public String toString() {
            return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")";
        }
    }
}
  •  

使用

UserBuilder userBuilder = User.builder();
User user = userBuilder
                .age(10)
                .id(1)
                .name("yanjun")
                .build();

System.out.println(": " + userBuilder.toString());

@Synchronized : 加个同步锁

package com.yanjun.mybatis.bean;

import lombok.Synchronized;

public class User {

    public Integer age;

    public String name;

    //普通方法,相当于对象锁
    @Synchronized
    int run1() {
        return 1;
    }

    //静态方法,相当于类锁
    @Synchronized
    static int run2() {
        return 2;
    }

}

代码的效果相当于

public class User {
    private final Object $lock = new Object[0];
    private static final Object $LOCK = new Object[0];
    public Integer age;
    public String name;

    public User() {
    }

    int run1() {
        Object var1 = this.$lock;
        synchronized(this.$lock) {
            return 1;
        }
    }

    static int run2() {
        Object var0 = $LOCK;
        synchronized($LOCK) {
            return 2;
        }
    }
}

 

 

 

 

 

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值