阿壩州城鄉(xiāng)建設網站百度競價廣告
思維導圖
常見知識點
一、SpringBoot
1.簡單介紹一下Spring及其優(yōu)缺點
1.1 概念
重量級企業(yè)開發(fā)框架EJB的替代品,通過依賴注入、面向切面編程,使用簡單Java對象POJO為企業(yè)Java開發(fā)提供了相對簡單的方法。
1.2 優(yōu)缺點
1.2.1 優(yōu)點
組件代碼輕量級
1.2.1 缺點
-
配置重量級
基于注解的組件掃描、基于Java配置雖然減少甚至消除了大量XML配置,還是需要不少配置。
??如下,需要XML或Java顯式配置:
開啟Spring特性 ---- 事務管理、SpringMVC;
啟用第三方庫 ---- 如基于Thymeleaf的Web視圖;
配置Servlet和過濾器; -
相關庫依賴,不同庫之間版本沖突
2.為什要SpringBoot?
Spring旨在簡化J2EE企業(yè)應用程序開發(fā),SpringBoot旨在簡化Spring開發(fā),減少配置文件,開箱即用。

3.使用SpringBoot的主要優(yōu)點?
- 開發(fā)基于Spring應用程序很容易。
- SpringBoot項目所需要的開發(fā)或工程時間明顯減少。
- SpringBoot不需要編寫大量樣板代碼、XML配置和注釋。
- SpringBoot引導應用程序可以很容易與Spring生態(tài)系統(tǒng)集成
如:Spring JDBC、Spring ORM、Spring Data、Spring Security等。 - SpringBoot遵循“固執(zhí)己見的默認配置”,減少開發(fā)工作(默認配置可以修改)。
- SpringBoot應用程序提供嵌入式HTTP服務器。
如:Tomcat和Jetty,可以輕松的開發(fā)和測試Web應用程序 ---- 普通運行Java程序的方式就能運行基于SpringBoot Web項目 - SpringBoot提供命令行接口(CLI)工具,用于開發(fā)和測試SpringBoot應用程序。
如:Java和Groovy。 - SpringBoot提供了很多插件。
如:可以使用內置工具(Maven和Gradle)開發(fā)和測試SpringBoot應用程序。
4.什么是SpringBoot Starers?
是一系列依賴關系的集合,簡化了項目的依賴關系,大大方便了我們開發(fā)導入依賴。
如: 沒有他之前,我們開發(fā)REST服務或Web應用程序時,需要手動一個一個添加SpringMVC、Tomcat、Jackso等庫,
有了他之后只要添加spring-boot-starter-web一個依賴就行了。
5.SpringBoot支持哪些內嵌的Servlet容器?
Name | Servlet Version |
---|---|
Tomcat9.0 | |
Jetty9.4 | |
Undertow2.0 |
你還可以將Spring引導應用程序部署到任何Servlet3.1+兼容的Web容器中。
6.@SpringBootApplication注解?
6.1 組成
-
@SpringBootConfiguration
允許上下文中注冊額外的bean或導入其他配置類 -
@ComponentScan
掃描被@Component(@Service、@Controller)注解的bean,注解默認會掃描改類所在包下的所有類 -
@EnableAutoConfiguration
-
啟用SpringBoot的自動配置機制
原理是根據(jù)@import,將符合配置條件的bean加載到Ioc容器中。
7.RESTful Web服務常用注解?
7.1 Spring Bean相關
-
@Autowired
自動導入對象到類中,被注入進的類同樣要被 Spring 容器管理。 -
@RestController
@RestController 注解是 @Controller和 @ ResponseBody 的合集,
表示這是個控制器 bean,并且是將函數(shù)的返回值直接填入 HTTP 響應體中,是 REST風格的控制器。 -
@Component
通用的注解,可標注任意類為 Spring 組件。
如果一個 Bean 不知道屬于哪個層,可以使用 @Component 注解標注。 -
@Repository :
對應持久層即 Dao 層,主要用于數(shù)據(jù)庫相關操作。 -
@Service
對應服務層,主要涉及一些復雜的邏輯,需要用到 Dao 層。 -
@Controller
對應 Spring MVC 控制層,主要用于接受用戶請求并調用 Service 層返回數(shù)據(jù)給前端頁面。
7.2 HTTP常見請求類型
- @GetMapping : GET 請求、
- @PostMapping : POST 請求。
- @PutMapping : PUT 請求。
- @DeleteMapping : DELETE 請求。
7.3 前后端傳值
-
@RequestParam 以及 @Pathvairable
@PathVariable用于獲取路徑參數(shù),
@RequestParam用于獲取查詢參數(shù)。 -
@RequestBody
用于讀取 Request 請求(可能是 POST,PUT,DELETE,GET 請求)的body 部分,并且 Content-Type 為 application/json 格式的數(shù)據(jù),接收到數(shù)據(jù)之后會自動將數(shù)據(jù)綁定到 Java 對象上去。
系統(tǒng)會使用 HttpMessageConverter 或者自定義的 HttpMessageConverter 將請求的 body 中的 json 字符串轉換為 java 對象。
8.Spring Boot 常用的讀取配置文件的方法?
8.1 通過 @value 讀取比較簡單的配置信息(不被推薦)
@Value("${wuhan2020}")
String wuhan2020;
8.2 通過 @ConfigurationProperties 讀取并與Bean綁定
8.3 通過 @ConfigurationProperties 讀取配置文件并校驗
8.4 @PropertySource 讀取指定的 properties 文件
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:website.properties")
@Getter
@Setter
class WebSite {@Value("${url}")private String url;
}
使用:
@Autowired
private WebSite webSite;
System.out.println(webSite.getUrl());//https://javaguide.cn/
9. Spring Boot 加載配置文件的優(yōu)先級?

10. 常用的 Bean 映射工具有哪些?
-
Bean 映射工具有屬性拷貝類功能,可以幫助我們節(jié)省大量的 set 和 get 操作。
-
常用如下:
Spring BeanUtils、MapStruct、Apache BeanUtils、ModelMapper、Dozer、Orika、JMapper 。
推薦用MapStruct、Spring BeanUtils
11.Spring Boot 如何做請求參數(shù)校驗?
只需要引入要 spring-boot-starter-web 依賴就夠了,它的子依賴包含了我們所需要的東西。
11.1 校驗注解
(1)JSR 提供的校驗注解
- @Null 被注釋的元素必須為 null
- @NotNull 被注釋的元素必須不為 null
- @AssertTrue 被注釋的元素必須為 true
- @AssertFalse 被注釋的元素必須為 false
- @Min(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
- @Max(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
- @DecimalMin(value) 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小
值 - @DecimalMax(value) 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大
值 - @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內
- @Digits (integer, fraction) 被注釋的元素必須是一個數(shù)字,其值必須在可接受的
范圍內 - @Past 被注釋的元素必須是一個過去的日期
- @Future 被注釋的元素必須是一個將來的日期
- @Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達式
(2)Hibernate Validator 提供的校驗注解
- @NotBlank(message =) 驗證字符串非 null,且長度必須大于 0
- @Email 被注釋的元素必須是電子郵箱地址
- @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內
- @NotEmpty 被注釋的字符串的必須非空
- @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內
使用示例:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {@NotNull(message = "classId 不能為空")private String classId;@Size(max = 33)@NotNull(message = "name 不能為空")private String name;@Pattern(regexp = "((^Man$|^Woman$|^UGM$))", message = "sex 值不在可選范圍"@NotNull(message = "sex 不能為空")private String sex;@Email(message = "email 格式不正確")@NotNull(message = "email 不能為空")private String email;
}
11.2 驗證請求體(RequestBody)
我們在需要驗證的參數(shù)上加上了 @Valid 注解,如果驗證失敗,它將拋出 MethodArgumentNotValidException 。
默認情況下,Spring 會將此異常轉換為 HTTP Status 400(錯誤請求)。
@RestController
@RequestMapping("/api")
public class PersonController {@PostMapping("/person")public ResponseEntity<Person> getPerson(@RequestBody @Valid Person person)return ResponseEntity.ok().body(person);}
}
11.3 驗證請求參數(shù)(Path Variables 和 Request Parameters)
一定一定不要忘記在類上加上 Validated 注解了,這個參數(shù)可以告訴 Spring 去校驗方法參數(shù)。
@RestController
@RequestMapping("/api")
@Validated
public class PersonController {@GetMapping("/person/{id}")public ResponseEntity<Integer> getPersonByID(@Valid @PathVariable("id") @Mreturn ResponseEntity.ok().body(id);}@PutMapping("/person")public ResponseEntity<String> getPersonByName(@Valid @RequestParam("name")return ResponseEntity.ok().body(name);}
}
12.Spring Boot 中如何實現(xiàn)定時任務 ?
12.1 @Scheduled 注解
創(chuàng)建一個定時任務
@Component
public class ScheduledTasks {private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.cprivate static final SimpleDateFormat dateFormat = new SimpleDateFormat("H/*** fixedRate:固定速率執(zhí)行。每5秒執(zhí)行一次。*/@Scheduled(fixedRate = 5000)public void reportCurrentTimeWithFixedRate() {log.info("Current Thread : {}", Thread.currentThread().getName());log.info("Fixed Rate Task : The time is now {}", dateFormat.format(new}
}
1
12.2 @EnableScheduling 注解
- 需要在啟動類上加上 @EnableScheduling 注解,這樣才可以啟動定時任務。
- @EnableScheduling 注解的作用是發(fā)現(xiàn)注解 @Scheduled 的任務并在后臺執(zhí)行該任務。
二、Netty
1.概述
1.1 為什么要選Netty?
- 使用Netty不必編寫復雜的邏輯代碼去實現(xiàn)通信,再也不需要去考慮性能問題,不需要考慮編碼問題,半包讀寫等問題。
- Netty是最流行的NIO框架,它的健壯性、功能、性能、可定制性和可擴展性在同類框架都是首屈一指的.
- 已經得到成百上千的商業(yè)/商用項目驗證,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通信框架Dubbox
1.2 BIO、NIO、AIO
1.3 Netty簡介
- Netty 是由 JBOSS 提供的一個 Java 開源框架, 現(xiàn)為 Github 上的獨立項目。
- Netty 是一個異步的、 基于事件驅動的網絡應用框架, 用以快速開發(fā)高性能、 高可靠性的網絡 IO 程序。
- Netty 主要針對在 TCP 協(xié)議下, 面向 Clients 端的高并發(fā)應用, 或者 Peer-to-Peer 場景下的大量數(shù)據(jù)持續(xù)傳輸?shù)膽谩?/li>
- Netty 本質是一個 NIO 框架, 適用于服務器通訊相關的多種應用場景。
1.4 Netty應用場景
1.4.1 互聯(lián)網行業(yè)
- 分布式系統(tǒng)中,各個節(jié)點之間需要遠程服務調用, 高性能的 RPC 框架必不可少, Netty 作為異步高性能的通信框架, 往往作為基礎通信組件被這些 RPC 框架使用。
- 典型的應用
阿里分布式服務框架 Dubbo 的 RPC 框架使用 Dubbo 協(xié)議進行節(jié)點間通信, Dubbo 協(xié)議默認使用 Netty 作為基礎通信組件, 用于實現(xiàn)各進程節(jié)點之間的內部通信
1.4.2 游戲行業(yè)
- 無論是手游服務端還是大型的網絡游戲,Java 語言得到了越來越廣泛的應用。
- Netty 作為高性能的基礎通信組件, 提供了 TCP/UDP 和 HTTP 協(xié)議棧, 方便定制和開發(fā)私有協(xié)議棧, 賬號登錄服務器。
- 地圖服務器之間可以方便的通過 Netty 進行高性能的通信。
1.4.3 大數(shù)據(jù)領域
- 經典的 Hadoop 的高性能通信和序列化組件 Avro 的 RPC 框架, 默認采用 Netty 進行跨界點通信。
- 它的 Netty Service 基于 Netty 框架二次封裝實現(xiàn)。
- 地圖服務器之間可以方便的通過 Netty 進行高性能的通信。
1.5 其他開源項目用到Netty
Netty官網
本篇主要參考鏈接如下:
Netty 介紹和應用場景(一)
本篇文章主要參考鏈接如下:
參考鏈接2-JavaGuide
持續(xù)更新中…
隨心所往,看見未來。Follow your heart,see light!
歡迎點贊、關注、留言,一起學習、交流!