diff --git a/README.md b/README.md
index 68ae4a54..0e8946c1 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,15 @@
## 打好基础
+* [《芋道 Spring Boot 快速入门》](http://www.iocoder.cn/Spring-Boot/quick-start/?github)
* [《芋道 Spring Boot 自动配置原理》](http://www.iocoder.cn/Spring-Boot/autoconfigure/?github) 对应 [lab-47](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-47) 。
+## 开发工具
+
+* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48) 。
+* [《芋道 Spring Boot 消除冗余代码 Lombok 入门》](http://www.iocoder.cn/Spring-Boot/Lombok/?github) 对应 [lab-49](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-49) 。
+* 《芋道 Spring Boot 对象转换 MapStruct 入门》计划中...
+
## Web 开发
* [《芋道 Spring Boot SpringMVC 入门》](http://www.iocoder.cn/Spring-Boot/SpringMVC/?github) 对应 [lab-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-23) 。
diff --git a/lab-09/pom.xml b/lab-09/pom.xml
index c46a9ee5..d941cab7 100644
--- a/lab-09/pom.xml
+++ b/lab-09/pom.xml
@@ -11,4 +11,9 @@
lab-09
+
+ 1.8
+ 1.8
+
+
diff --git a/lab-46/lab-46-sentinel-demo-nacos/pom.xml b/lab-46/lab-46-sentinel-demo-nacos/pom.xml
index 1cc94441..89f516c0 100644
--- a/lab-46/lab-46-sentinel-demo-nacos/pom.xml
+++ b/lab-46/lab-46-sentinel-demo-nacos/pom.xml
@@ -13,7 +13,6 @@
lab-46-sentinel-demo-nacos
-
org.springframework.boot
diff --git a/lab-48/lab-48-demo/pom.xml b/lab-48/lab-48-demo/pom.xml
new file mode 100644
index 00000000..359e30f3
--- /dev/null
+++ b/lab-48/lab-48-demo/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-48-demo
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java
new file mode 100644
index 00000000..8dd7f0c4
--- /dev/null
+++ b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab48.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java
new file mode 100644
index 00000000..9f50cf75
--- /dev/null
+++ b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab48.demo.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/demo")
+public class DemoController {
+
+ @GetMapping("/echo")
+ public String echo() {
+ return "echo";
+ }
+
+}
diff --git a/lab-48/pom.xml b/lab-48/pom.xml
new file mode 100644
index 00000000..be39149e
--- /dev/null
+++ b/lab-48/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-48
+ pom
+
+ lab-48-demo
+
+
+
+
diff --git a/lab-49/lab-49-lombok-demo/pom.xml b/lab-49/lab-49-lombok-demo/pom.xml
new file mode 100644
index 00000000..52cef5fd
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ 4.0.0
+
+ lab-49-lombok-demo
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java
new file mode 100644
index 00000000..69101f2e
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab49.lombokdemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class LombokApplication {
+
+ public static void main(String[] args) {
+ // 启动 Spring Boot 应用
+ SpringApplication.run(LombokApplication.class, args);
+ }
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java
new file mode 100644
index 00000000..83597282
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab49.lombokdemo.dataobject;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户 DO
+ */
+@Setter
+@Getter
+public class UserDO {
+
+ private String username;
+ private String password;
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java
new file mode 100644
index 00000000..e6f0f61a
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java
@@ -0,0 +1,14 @@
+package cn.iocoder.springboot.lab49.lombokdemo.dataobject;
+
+import lombok.Data;
+
+/**
+ * 用户 DO
+ */
+@Data
+public class UserDO01 {
+
+ private String username;
+ private String password;
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java
new file mode 100644
index 00000000..4973d7d6
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab49.lombokdemo.service;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class UserService {
+
+ public static void staticMethod() {
+ log.info("静态方法示例");
+ }
+
+ public void normalMethod() {
+ log.info("普通方法示例");
+ }
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java
new file mode 100644
index 00000000..7e15837e
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java
@@ -0,0 +1,27 @@
+package cn.iocoder.springboot.lab49.lombokdemo.service;
+
+import cn.iocoder.springboot.lab49.lombokdemo.dataobject.UserDO;
+import com.sun.istack.internal.NotNull;
+import lombok.NonNull;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserService01 {
+
+ @NonNull
+ public void test01(UserDO userDO) {
+ System.out.println(userDO.getUsername());
+ System.out.println(userDO.getPassword());
+ }
+
+ public void test02(@NotNull String username, String password) {
+
+ }
+
+ public void test03() {
+ @NonNull String username = "";
+ String password = "";
+ }
+
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java
new file mode 100644
index 00000000..81016d64
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java
@@ -0,0 +1,17 @@
+package cn.iocoder.springboot.lab49.lombokdemo.dataobject;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class UserDOTest {
+
+ @Test
+ public void demo01() {
+ UserDO user = new UserDO();
+ user.setUsername("username:1");
+ user.setPassword("password:1");
+ System.out.println(user);
+ }
+
+}
diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java
new file mode 100644
index 00000000..2d9c37e7
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.springboot.lab49.lombokdemo;
diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java
new file mode 100644
index 00000000..cbd2800f
--- /dev/null
+++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java
@@ -0,0 +1,16 @@
+package cn.iocoder.springboot.lab49.lombokdemo.service;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class UserService01Test {
+
+ private UserService01 userService01 = new UserService01();
+
+ @Test
+ public void test02() {
+ userService01.test02(null, null);
+ }
+
+}
diff --git a/lab-49/pom.xml b/lab-49/pom.xml
new file mode 100644
index 00000000..3d9d97a4
--- /dev/null
+++ b/lab-49/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-49
+ pom
+
+ lab-49-lombok-demo
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 787a491a..d39faf91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,7 +56,8 @@
lab-45
lab-46
lab-47
+ lab-48
+ lab-49
-