本周(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
勾选上。 -
Build project automatically
后面的一行提示,自动编译仅在项目不处于运行,或者处于 Debug 运行中时,才会自动生效 -
IDEA 提供了 HotSwap 插件,可以实现真正的热部署。
-
修改项目的Run Configuration的
Running Application Update Polocies
为Update 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 方法的,因此两者在一起使用时,需要进行相应的配置。
-
在对象转换时,我们可能会存在属性不是完全映射的情况,例如说属性名不同。此时,我们可以使用 MapStruct 提供的
@Mapping
注解,配置相应的映射关系。示例如下图:
@Mapping
注解还支持多个对象转换为一个对象。- MapStruct 提供了 IDEA MapStruct Support 插件,在 使用IDEA开发过程中,可以更愉快的使用 MapStruct