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

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

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