学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门

本周(8.21-8.27)将学习芋道 Spring Boot的以下文章:
8.21: 快速入门
8.22:Spring Boot 自动配置原理 、Jar 启动原理
8.23:调试环境、 热部署入门、消除冗余代码 Lombok 入门
8.24:对象转换 MapStruct 入门、SpringMVC 入门
8.25: WebFlux 入门、 分布式 Session 入门
8.26:API 接口文档 Swagger 入门、API 接口文档 Swagger Starter 入门
8.27:参数校验 Validation 入门、WebSocket 入门

芋道 Spring Boot 调试环境

  • Gradle 支持使用 Maven 依赖,所以可以使用阿里云的 Maven 镜像
  • 使用 spring-boot-smoke-test-tomcat 项目可以调试SpringBoot项目的启动环境

芋道 Spring Boot 热部署入门

  • spring-boot-devtools 是 Spring Boot 提供的开发者工具,它会监控当前应用所在的 classpath 下的文件发生变化,进行自动重启

  • spring-boot-devtools没有采用热部署的方式,而是一种较快的重启方式。

  • Spring Boot 通过使用两个类加载器来提供了重启技术。

    • 不改变的类(例如,第三方 jar)被加载到 base 类加载器中。
    • 经常处于开发状态的类被加载到 restart 类加载器中。
    • 当应用重启时,restart 类加载器将被丢弃,并重新创建一个新的。这种方式意味着应用重启比冷启动要快得多,因为省去 base 类加载器的处理步骤,并且可以直接使用。
  • 点击 IDEA 的菜单 IntelliJ IDEA -> Preference...,然后选择 Compiler 选项卡,将 Build project automatically 勾选上。

    学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门_第1张图片

  • Build project automatically 后面的一行提示,自动编译仅在项目不处于运行,或者处于 Debug 运行中时,才会自动生效

  • IDEA 提供了 HotSwap 插件,可以实现真正的热部署。

    学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门_第2张图片

  • 修改项目的Run Configuration的Running Application Update PolociesUpdate classes and resources,此时焦点从 IDEA 离开,IEDA会自动触发更新类和资源

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UX50Lhqj-1629732382336)(http://www.iocoder.cn/images/Spring-Boot/2019-01-04/23.png)]

  • Jrebel 是比较有名的一款 Java 热部署插件。

芋道 Spring Boot 消除冗余代码 Lombok 入门

  • Lombok 是一个 Java 工具,通过使用其定义的注解,自动生成常见的冗余代码,提升开发效率。

  • 添加Lombok依赖后,只需在 Java POJO 类上,添加 @Setter@Getter 注解,自动生成 set、get 方法的代码。

  • Lombok 的实现原理,基于 JSR269(Pluggable Annotation Processing API) 规范,自定义编译器注解处理器,用于在 Javac 编译阶段时,扫描使用到 Lombok 定义的注解的类,进行自定义的代码生成。

  • Lombok 的注解非常多,主要有以下注解。

    • @Getter 注解,添加在属性上,生成对应的 get 方法。

    • @Setter 注解,添加在属性上,生成对应的 set 方法。

    • @ToString 注解,添加在上,生成 toString 方法。

    • @EqualsAndHashCode 注解,添加在上,生成 equals 和 hashCode 方法。

    • @AllArgsConstructor@RequiredArgsConstructor@NoArgsConstructor 注解,添加在上,为类自动生成对应参数的构造方法。

    • @Data 注解,添加在上,是 5 个 Lombok 注解的组合。

      • 为所有属性,添加 @Getter@ToString@EqualsAndHashCode 注解的效果
      • 为非 final 修饰的属性,添加 @Setter 注解的效果
      • final 修改的属性,添加 @RequiredArgsConstructor 注解的效果
    • @Value 注解,添加在上,和 @Data 注解类似,区别在于它会把所有属性默认定义为 private final 修饰,所以不会生成 set 方法。

    • @CommonsLog@Flogger@Log@JBossLog、@Log4j、@Log4j2、@Slf4j、@Slf4jX 注解,添加在上,自动为类添加对应的日志支持。

    • @NonNull 注解,添加在方法参数类属性上,用于自动生成 null 参数检查。若确实是 null 时,抛出 NullPointerException 异常。

    • @Cleanup 注解,添加在方法中的局部变量上,在作用域结束时会自动调用 #close() 方法,来释放资源。例如说,使用在 Java IO 流操作的时候。

    • @Builder 注解,添加在上,给该类加个构造者模式 Builder 内部类。

    • @Synchronized 注解,添加在方法上,添加同步锁。

    • @SneakyThrows 注解,添加在方法上,给该方法添加 try catch 代码块。

    • @Accessors 注解,添加在方法属性上,并设置 chain = true,实现链式编程。

芋道 Spring Boot 对象转换 MapStruct 入门

  • 不同的项目分层对应的对象不同

    • DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
    • DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
    • BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
  • 手动进行对象的转换,虽然执行性能很高,但是开发效率非常低下,且可能会存在漏写的情况。因此,我们会选择借助框架或是工具来实现对象的转换,例如:

    • Spring BeanUtils
    • Apache BeanUtils
    • Dozer
    • Orika
    • MapStruct
    • ModelMapper
    • JMapper
  • MapStruct基于 JSR 269 的 Java 注解处理器(与Lombok一致),自动生成对象的代码,使用便捷,性能优秀。

  • 通过创建一个 MapStruct Mapper 接口,并定义一个转换接口方法,后续交给 MapStruct 自动生成对象转换的代码即可。

  • MapStruct使用纯 Java 的方法调用源对象和目标对象之间进行映射,并非 Java 反射机制

  • 与动态映射框架相比,MapStruct 具有以下优点:

    • 使用纯 Java 方法代替 Java 反射机制快速执行。
    • 编译时类型安全:只能映射彼此的对象和属性,不能映射一个 Order 实体到一个 Customer DTO 中等等。
    • 如果无法映射实体或属性,则在编译时清除错误报告。
  • 通过 Lombok 帮我们自动生成相对“冗余”代码,例如说 setter、getter 等等方法。恰好,MapStruct 自动生成的对象转换的代码,也是依赖 setter、getter 方法的,因此两者在一起使用时,需要进行相应的配置。

    学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门_第3张图片

  • 在对象转换时,我们可能会存在属性不是完全映射的情况,例如说属性名不同。此时,我们可以使用 MapStruct 提供的 @Mapping 注解,配置相应的映射关系。示例如下图:

学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门_第4张图片

  • @Mapping 注解还支持多个对象转换为一个对象。
  • MapStruct 提供了 IDEA MapStruct Support 插件,在 使用IDEA开发过程中,可以更愉快的使用 MapStruct

你可能感兴趣的:(SpringBoot,学习与成长)