SpringBoot 2.x 整合Lombok

转载请标明出处:http://blog.youkuaiyun.com/zhaoyanjun6/article/details/80743302
本文出自【赵彦军的博客】

简介

lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。比如日常开发过程中需要生产大量的JavaBean文件,每个JavaBean都需要提供大量的getset方法,如果字段较多且发生变动的话修改起来相对繁琐,相应的lombok可以通过注解(@getter,@setter)为我们省去手动创建gettersetter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成gettersetter方法。

即它最终能够达到的效果是:在源码中没有gettersetter方法,但是在编译生成的字节码文件中有gettersetter方法。

另外在项目开发阶段,一个class的属性是一直变化的,今天可能增加一个字段,明天可能删除一个字段。每次变化都需要修改对应的模板代码。另外,有的class的字段超级多,多到一眼看不完。如果加上模板代码,更难一眼看出来。更有甚者,由于字段太多,想要使用builder来创建。手动创建builder和字段和原来的类夹杂在一起,看起来很凌乱。lombok@Builder即可解决这个问题。

官网地址:https://projectlombok.org/

lombok最新版本号:http://jcenter.bintray.com/org/projectlombok/lombok/

官方文档: https://projectlombok.org/features/all

lombok 注解介绍: http://blog.youkuaiyun.com/sunsfan/article/details/53542374

安装 lombok 插件

这里写图片描述

添加注解支持

这里写图片描述

添加依赖

buildscript {
    ext {
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.yanjun'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter',
            'org.springframework.boot:spring-boot-starter-web',
    )

    //添加lombok依赖
    compile 'org.projectlombok:lombok:1.18.0'

}

常用注解

  • @Data 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
  • @Setter :注解在属性上;为属性提供 setting 方法
  • @Setter :注解在属性上;为属性提供 getting 方法
  • @Log4j :注解在类上;为类提供一个 属性名为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;
        }
    }
}

个人微信号:zhaoyanjun125 , 欢迎关注

<think>好的,我现在需要分析用户的问题,关于Spring Boot 3.x相对于2.x的优化和升级。首先,用户之前询问了Java的安全性,现在转向Spring Boot的版本差异,可能是在实际开发中需要升级项目,或者学习新版本特性。用户可能是开发人员,有一定的Spring Boot使用经验,希望了解升级带来的变化,以便评估是否值得升级,或者避免潜在的兼容性问题。 接下来,我需要回忆Spring Boot 3.x的主要更新点。首先,Spring Boot 3.x基于Spring Framework 6,而Spring Framework 6需要Java 17及以上,这是一个重要的升级点。Java 17的新特性如密封模式匹配等可能被Spring Boot 3.x利用,同时版本升级可能带来性能优化。 然后,Jakarta EE的迁移,从javax到jakarta命名空间,这会影响很多依赖,比如Servlet API、JPA等。用户升级时需要注意修改import语句,以及依赖库是否兼容Jakarta EE 9或10。例如,原来的javax.servlet需要改为jakarta.servlet,这可能涉及到代码中的多处修改,以及第三方库的升级。 另外,GraalVM原生镜像的支持增强,Spring Boot 3.x对Spring Native的集成,使得构建原生应用更方便。这对于需要快速启动和低内存占用的云原生应用来说是一个重要的优化点,用户如果关注云部署,这点会很关键。 还有配置属性的变化,可能有些旧的配置项被废弃,新的配置项引入。比如,Spring Boot 2.x中的某些配置在3.x中可能不再适用,需要查阅官方文档进行迁移。此外,自动配置的改进可能带来更智能的默认配置,减少开发者的手动配置工作。 在依赖管理方面,Spring Boot 3.x会更新其starter依赖的版本,比如Spring Data、Spring Security等,这些子项目的版本升级可能带来新功能或API变化。用户需要注意这些依赖的兼容性,特别是如果项目中使用了特定版本的库,可能需要调整版本号。 还有响应式编程的增强,如果用户的项目使用了WebFlux,Spring Boot 3.x可能提供了更好的支持或性能优化。另外,Actuator端点的改进,监控和管理功能的增强也是可能的升级点。 另外,安全方面的改进,比如默认的SSL配置更严格,或者集成了新的安全特性,这也是需要考虑的。比如,OAuth2的支持是否有变化,或者Spring Security的集成方式是否有调整。 测试方面,可能引入了新的测试工具或改进了现有的测试支持,比如对JUnit 5的进一步整合,或者Mockito版本的升级,影响单元测试的编写方式。 文档和社区支持方面,用户升级时需要参考Spring Boot 3.x的官方迁移指南,了解破坏性变更和推荐的升级步骤。同时,社区可能已经有一些常见问题的解决方案,用户遇到问题可以更快找到帮助。 最后,需要总结这些变化带来的好处和挑战,比如更好的性能、新功能支持,但也要面对代码修改和依赖升级的成本。用户需要权衡这些因素,决定是否进行升级,或者如何规划升级路径。</think>以下是 Spring Boot 3.x 相较于 2.x 的核心升级与优化,按技术维度分说明: --- ### **一、基础框架升级** | **特性** | **Spring Boot 2.x** | **Spring Boot 3.x** | **影响范围** | |-----------------------|------------------------------------|---------------------------------------|-------------------------------| | **Java 版本** | 最低 Java 8 | **强制要求 Java 17+** | 需升级 JDK | | **Spring Framework** | 5.x 系列 | **6.x 系列** | 全面支持 JDK 17 特性 | | **Jakarta EE** | 基于 Java EE (javax.*) | **全面迁移至 Jakarta EE 9+ (jakarta.*)** | 所有 javax 包名需替换 | ```java // ❌ 旧版代码(2.x) import javax.servlet.http.HttpServletRequest; // ✅ 新版代码(3.x) import jakarta.servlet.http.HttpServletRequest; ``` --- ### **二、核心技术增强** #### **1. GraalVM 原生镜像支持** - 深度集成 **Spring Native**,无需额外依赖 - 编译为原生可执行文件(启动时间 < 100ms) ```bash # 构建命令升级 ./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=demo ``` #### **2. 响应式编程强化** - **Project Reactor 2022.0+** 默认支持 - 新增 `RSocketClientAutoConfiguration` 自动配置 #### **3. HTTP 客户端升级** | 客户端型 | 2.x 默认实现 | 3.x 默认实现 | |------------------|--------------------|----------------------| | **RestTemplate** | Apache HttpClient | **JDK HttpClient** | | **WebClient** | Reactor Netty | **保持但性能优化** | --- ### **三、配置与功能的重大变更** #### **1. 属性配置迁移** ```properties # 2.x 配置 server.servlet.context-path=/api # 3.x 新配置(更语义化) spring.application.name=myapp spring.mvc.servlet.path=/api ``` #### **2. 废弃功能移除** - 移除 **Springfox Swagger** 支持 → 改用 **SpringDoc OpenAPI** - 删除 **Jersey** 自动配置(需手动添依赖) - 停用 **EhCache 2.x** → 强制升级至 **EhCache 3** #### **3. 安全升级** - **Spring Security 6.x** 默认集成 - OAuth2 资源服务器配置简化: ```java // 新版配置(3.x) @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); } ``` --- ### **四、监控与可观测性** | 模块 | 2.x 功能 | 3.x 增强点 | |--------------------|---------------------------------|------------------------------------| | **Actuator** | 基础健康检查/指标 | 新增 **Prometheus Exemplar** 支持 | | **Micrometer** | 1.10.x | **1.11+** 集成 OpenTelemetry | | **日志追踪** | 需手动配置 Sleuth | **原生支持 Trace ID 透传** | --- ### **五、依赖管理升级** | 依赖项 | 2.x 默认版本 | 3.x 默认版本 | |---------------------|-----------------|------------------| | **Hibernate** | 5.6.x | **6.2.x** | | **Tomcat** | 9.0.x | **10.1.x** | | **Jetty** | 10.x | **11.x** | | **JUnit Jupiter** | 5.8.x | **5.9.x** | --- ### **六、典型代码迁移示例** #### **1. 构造函数注入强制要求** ```java // 2.x 允许字段注入 @Autowired private UserService userService; // 3.x 推荐构造函数注入(Lombok 简化) @RequiredArgsConstructor @Service public class MyService { private final UserService userService; } ``` #### **2. 日期时间型处理** ```java // 2.x 使用 java.util.Date @JsonFormat(pattern = "yyyy-MM-dd") private Date createTime; // 3.x 推荐 java.time.* @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime createTime; ``` --- ### **升级注意事项** 1. **兼容性检查工具** 使用 `spring-boot-properties-migrator` 自动检测废弃配置 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> </dependency> ``` 2. **分阶段升级建议** ``` 2.7.x → 3.0.x → 3.1.x(逐步处理破坏性变更) ``` 3. **常见问题** - 遇到 `NoSuchMethodError`:检查第三方库是否支持 Jakarta EE - 日志报错 `javax` 不存在:使用 IDE 全局替换为 `jakarta` --- Spring Boot 3.x 通过拥抱现代 Java 生态(JDK 17/Jakarta EE/GraalVM),为云原生和微服务场景提供了更强大的基础设施。升级过程需重点关注包名变更和依赖兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值