Skip to content

Lombok

因为Spring Boot中有默认依赖的lombok版本,所以只要引入依赖即可

xml
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
	</dependency>

对于<version>${lombok.version}</version>可加可不加

基本使用

idea也需要安装lombok插件来得到更好的代码提示信息(使用相关注解后属性颜色不再为灰色,而是紫色,方法也不会再出现识别不出而报错)

image-20230327144141651

在加入Lombok依赖后,可以使用如下几个注解来简化bean的开发

  • @Data:用于类上,给类中所有的属性添加get方法、set方法、toString方法和重写equals和hashCode方法
    • @Setter:用于类上,给类中的所有属性添加set方法
    • @Getter:用于类上,给类中的所有属性添加get方法
    • @ToString:用于类上,给类重写toString方法
    • @EqualsAndHashCode:用于类上,给类重写equalshashCode方法,默认行为callSuper = false,生成的equals()hashCode()方法不调用父类的equals()hashCode()方法
  • @NoArgsConstructor:用于类上,给类添加无参构造方法
  • @AllArgsConstructor:用于类上,给类添加满参构造方法
  • @Slf4j:用于类上,导入日志模块,可以通过log对象去调用日志中的方法
    • log.info("name: {}, age: {}, address: {}", name, age, address);:通过log对象可以将日志信息打印到控制台,减少样板代码,使代码更加简洁
  • @RequiredArgsConstructor(onConstructor_ = {@Lazy, @Autowired}):给final修饰的属性或者带有@NonNull注解的字段添加构造方法,并添加@Lazy@Autowired注解
  • @Accessors(chain = true):让Lombok自动生成支持链式调用的setter方法。默认情况下,Lombok的setter方法会返回void,而启用chain = true后,setter方法会返回当前对象(this
  • @SneakyThrows:注解标注一个方法时,可以直接调用那些会抛出检查型异常的方法,而不需要显式地捕获或声明抛出这些异常。Lombok在编译时会自动生成相应的异常处理代码,通常是将异常包装成一个运行时异常(unchecked exception),然后抛出
java
    private static final Logger logger = LoggerFactory.getLogger(User.class);

Spring传统的日志记录方法,使用SLF4J(Simple Logging Facade for Java)作为日志门面,来获取一个特定类的日志记录器,两者使用上保持一致

@Builder注解

生成Builder模式的代码

  • 创建一个名为ThisClassBuilder的内部静态类,并具有和实体类形同的属性(称为构建器)
  • 在构建器中:
    • 对于目标类中的所有的属性和未初始化的final字段(对于final修饰的属性不会生成对应的build方法),都会在构建器中创建对应属性
    • 创建一个无参的default构造函数
    • 对于实体类中的每个参数,都会对应创建类似于setter的方法,只不过方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
    • 生成一个build()方法,调用此方法,就会根据设置的值进行创建实体对象
    • 同时也会生成一个toString()方法
  • 在实体类中:
    • 会创建一个builder()方法,用来创建构建器

手写简单的builder实现User.java

java
public class User {

    private String username;
    private String password;

    User(String username, String password) {
        this.username = username;
        this.password = password;
    }

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

    public static class UserBuilder {
        private String username;
        private String password;

        UserBuilder() {
        }

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

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

        public User build() {
            return new User(this.username, this.password);
        }

        public String toString() {
            return "User.UserBuilder(username=" + this.username + ", password=" + this.password + ")";
        }
    }
}
java
        User user = User.builder()
                .username("yxx")
                .password("yxx")
                .build();