Java 面試題-Spring、Spring MVC、Spring Boot
1.Spring MVC 的常用註解有哪些?
- @Component:標註一個普通的Spring Bean類。
- @Controller:標註一個控制器元件類。
- @RestController:標識一個 Web 應用程式控制層,用於從 http body 返回資料,相當於 @Controller + @ResponseBody
- @Service:標註一個業務層元件類。
- @Repository:標註一個dao持久層元件類。
- @RequestMapping:對映一個 URL 的訪問路徑。
- @GetMapping:對映一個 Get URL 的訪問路徑。
- @PostMapping:對映一個 Post URL 的訪問路徑。
- @ResponseBody :以 http body 響應資料。
- @PathVariable:將變數對映到 URL 路徑上。
- @RequestParam:接受執行名稱的請求引數。
- @RequestBody :表示從 http body 接收引數。
2.為什麼要使用 Spring?
- spring 提供 ioc 技術,容器會幫你管理依賴的物件,從而不需要自己建立和管理依賴物件了,更輕鬆的實現了程式的解耦。
- spring 提供了事務支援,使得事務操作變的更加方便。
- spring 提供了面向切片程式設計,這樣可以更方便的處理某一類的問題。
- 更方便的框架整合,spring 可以很方便的整合其他框架,比如 MyBatis、hibernate 等。
3.解釋一下什麼是 AOP?
aop 是面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。
簡單來說就是統一處理某一“切面”(類)的問題的程式設計思想,比如統一處理日誌、異常等。
4.解釋一下什麼是 IOC?
ioc:Inversionof Control(中文:控制反轉)是 spring 的核心,對於 spring 框架來說,就是由 spring 來負責控制物件的生命週期和物件間的關係。
簡單來說,控制指的是當前物件對內部成員的控制權;控制反轉指的是,這種控制權不由當前物件管理了,由其他(類,第三方容器)來管理。
5.Spring 有哪些主要模組?
- spring core:框架的最基礎部分,提供 ioc 和依賴注入特性。
- spring context:構建於 core 封裝包基礎上的 context 封裝包,提供了一種框架式的物件訪問方法。
- spring dao:Data Access Object 提供了JDBC的抽象層。
- spring aop:提供了面向切面的程式設計實現,讓你可以自定義攔截器、切點等。
- spring Web:提供了針對 Web 開發的整合特性,例如檔案上傳,利用 * servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
- spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應用的 Model-View-Controller(MVC)的實現。
6.Spring 常用的注入方式有哪些?
- setter 屬性注入
- 構造方法注入
- 註解方式注入
7.Spring 中的 bean 是執行緒安全的嗎?
spring 中的 bean 預設是單例模式,spring 框架並沒有對單例 bean 進行多執行緒的封裝處理。
實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 物件),那就要開發者自己去保證執行緒安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當於 new Bean()了,所以就可以保證執行緒安全了。
- 有狀態就是有資料儲存功能。
- 無狀態就是不會儲存資料。
8.Spring 支援幾種 bean 的作用域?
spring 支援 5 種作用域,如下:
- singleton:spring ioc 容器中只存在一個 bean 例項,bean 以單例模式存在,是系統預設值;
- prototype:每次從容器呼叫 bean 時都會建立一個新的示例,既每次 getBean()相當於執行 new Bean()操作;
Web 環境下的作用域: - request:每次 http 請求都會建立一個 bean;
- session:同一個 http session 共享一個 bean 例項;
- global-session:用於 portlet 容器,因為每個 portlet 有單獨的 session,globalsession 提供一個全域性性的 http session。
9.Spring 自動裝配 bean 有哪些方式?
- no:預設值,表示沒有自動裝配,應使用顯式 bean 引用進行裝配。
- byName:它根據 bean 的名稱注入物件依賴項。
- byType:它根據型別注入物件依賴項。
- 建構函式:通過建構函式來注入依賴項,需要設定大量的引數。
- autodetect:容器首先通過建構函式使用 autowire 裝配,如果不能,則通過 byType 自動裝配。
10.spring 事務實現方式有哪些?
- 宣告式事務:宣告式事務也有兩種實現方式,基於 xml 配置檔案的方式和註解方式(在類上新增 @Transaction 註解)。
- 編碼方式:提供編碼的形式管理和維護事務。
11.說一下 Spring 的事務隔離?
spring 有五大隔離級別,預設值為 ISOLATION_DEFAULT(使用資料庫的設定),其他四個隔離級別和資料庫的隔離級別一致:
- ISOLATION_DEFAULT:用底層資料庫的設定隔離級別,資料庫設定的是什麼我就用什麼;
- ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、髒讀、不可重複讀);
- ISOLATIONREADCOMMITTED:提交讀,一個事務提交後才能被其他事務讀取到(會造成幻讀、不可重複讀),SQL server 的預設級別;
- ISOLATIONREPEATABLEREAD:可重複讀,保證多次讀取同一個資料時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的資料(會造成幻讀),MySQL 的預設級別;
- ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。
髒讀 :表示一個事務能夠讀取另一個事務中還未提交的資料。比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然後另一個事務嘗試讀取到了記錄 A。
不可重複讀 :是指在一個事務內,多次讀同一資料。
幻讀 :指同一個事務內多次查詢返回的結果集不一樣。比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的原因也是另外一個事務新增或者刪除或者修改了第一個事務結果集裡面的資料,同一個記錄的資料內容被修改了,所有資料行的記錄就變多或者變少了。
12.說一下 Spring MVC 執行流程?
- spring mvc 先將請求傳送給 DispatcherServlet。
- DispatcherServlet 查詢一個或多個 HandlerMapping,找到處理請求的 Controller。
- DispatcherServlet 再把請求提交到對應的 Controller。
- Controller 進行業務邏輯處理後,會返回一個ModelAndView。
- Dispathcher 查詢一個或多個 ViewResolver 檢視解析器,找到 * ModelAndView 物件指定的檢視物件。
- 檢視物件負責渲染返回給客戶端。
13.Spring MVC 有哪些元件?
- 前置控制器 DispatcherServlet。
- 對映控制器 HandlerMapping。
- 處理器 Controller。
- 模型和檢視 ModelAndView。
- 檢視解析器 ViewResolver。
14.@RequestMapping 的作用是什麼?
將 http 請求對映到相應的類/方法上。
15.@Autowired 的作用是什麼?
@Autowired 它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作,通過@Autowired 的使用來消除 set/get 方法。
16.Spring Boot 是什麼?有哪些優缺點?核心思想是什麼?
- 是什麼?
Spring Boot 是為 spring 服務的,是用來簡化新 spring 應用的初始搭建以及開發過程的。 - 優點
獨立執行、簡化配置、自動配置、應用監控 - 缺點
如果不瞭解其核心技術及流程,遇到問題很難解決 - 核心思想
約定大於配置
17.為什麼要用 Spring Boot?
- 配置簡單
- 獨立執行
- 自動裝配
- 無程式碼生成和 xml 配置
- 提供應用監控
- 易上手
- 提升開發效率
18.Spring Boot 核心配置檔案是什麼?
- bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 載入的,比 applicaton 優先載入,且 boostrap 裡面的屬性不能被覆蓋;
- application (. yml 或者 . properties):用於 spring boot 專案的自動化配置。
19.Spring Boot 配置檔案有哪幾種類型?它們有什麼區別?
配置檔案有 . properties 格式和 . yml 格式,它們主要的區別是書法風格不同。
. properties 配置如下:
spring. RabbitMQ. port=5672
. yml 配置如下:
spring:
RabbitMQ:
port: 5672
. yml 格式不支援 @PropertySource 註解匯入。
20.Spring Boot 有哪些方式可以實現熱部署?
- 使用 devtools 啟動熱部署,新增 devtools 庫,在配置檔案中把 spring. devtools. restart. enabled 設定為 true;
- 使用 Intellij Idea 編輯器,勾上自動編譯或手動重新編譯。
21.Spring Boot 有哪些核心模組?
- spring-boot
spring boot 的主模組 - spring-boot-autoconfigure
自動配置 - spring-boot-starters
啟動器 - spring-boot-cli
命令列工具 - spring-boot-actuator
監控工具 - spring-boot-test
單元測試
22.Spring Boot 的核心註解是哪個?
@SpringBootApplication
23.SpringBootApplication 註解包含哪幾個註解?
- SpringBootConfiguration:組合了 @Configuration 註解,實現配置檔案的功能。
- EnableAutoConfiguration:開啟自動配置的功能。
- ComponentScan:Spring 元件掃描。
24.Spring Boot 中的 Starters 是什麼?
Starters 可以理解為啟動器,它包含了一系列可以繼承到應用裡面的依賴包,可以一站式整合 Spring 及其他技術,例如:
如果你想使用 Spring JPA 訪問資料庫,只要加入 spring-boot-starter-data-jpa 啟動器依賴就能使用了。
25.Spring Boot 配置載入順序是怎麼樣的?
- properties檔案;
- YAML檔案;
- 系統環境變數;
- 命令列引數;
26.Spring Boot 2.X 有什麼新特性?
- 配置變更
- JDK 版本升級
- 第三方類庫升級
- 響應式 Spring 程式設計支援
- HTTP/2 支援
- 配置屬性繫結