Spring Boot 是微服務中最好的 Java 框架。為了更好的理解與使用SpringBoot,同時,為了記錄平時的點點滴滴,便於日后的面試!
1、什么是SpringBoot?
- 用來簡化Spring應用的初始搭建以及開發過程,使用特定的方式來進行配置
- 創建獨立的Spring引用程序main方法運行
- 嵌入的tomcat無需部署war文件
- 簡化maven配置
- 自動配置Spring添加對應的功能starter自動化配置
SpringBoot來簡化Spring應用開發,約定大於配置,去繁化簡
2、SpringBoot有哪些優缺點?
優點
-
獨立運行
Spring Boot 而且內嵌了各種 servlet 容器,Tomcat、Jetty 等,現在不再需要打成war 包部署到容器中,Spring Boot 只要打成一個可執行的 jar 包就能獨立運行,所有的依賴包都在一個 jar 包內。
-
簡化配置
spring-boot-starter-web 啟動器自動依賴其他組件,簡少了 maven 的配置。
-
自動配置
Spring Boot 能根據當前類路徑下的類、jar 包來自動配置 bean,如添加一個 spring
boot-starter-web 啟動器就能擁有 web 的功能,無需其他配置。
-
無代碼生成和XML配置
Spring Boot 配置過程中無代碼生成,也無需 XML 配置文件就能完成所有配置工作,這一切都是借助於條件注解完成的,這也是 Spring4.x 的核心功能之一。
-
應用監控
Spring Boot 提供一系列端點可以監控服務及應用,做健康檢測。
缺點
Spring Boot 雖然上手很容易,但如果你不了解其核心技術及流程,所以一旦遇到問題就很棘手,而且現在的解決方案也不是很多,需要一個完善的過程。
3、SpringBoot、Spring MVC和Spring有什么區別?
Spring
Spring最重要的特征是依賴注入。所有Spring Modules不是依賴注入就是IOC控制反轉。
當我們恰當的使用DI或者是IOC的時候,可以開發松耦合應用。
Spring MVC
Spring MVC提供了一種分離式的方法來開發Web應用。通過運用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的非常簡單。
SpringBoot
Spring和Spring MVC的問題在於需要配置大量的參數。
SpringBoot通過一個自動配置和啟動的項來解決這個問題。
4、什么是Spring Boot Starter?
啟動器是一套方便的依賴描述符,它可以放在自己的程序中。可以一站式的獲取你所需要的Spring和相關技術,而不需要依賴描述符的通過示例代碼搜索和復制粘貼的負載。
例如,如果想使用Spring和JPA訪問數據庫,只需要項目中包含spring-boot-starter-data-jpa 依賴項,你就可以正產是用。
5、為什么需要spring-boot-maven-plugin?
spring-boot-maven-plugin提供了一些像jar一樣打包或者運行應用程序的命令。
spring-boot:run 運行SpringBoot應用程序; spring-boot:repackage 重新打包你的jar包或者是war包使其可執行 spring-boot:start和spring-boot:stop管理Spring Boot應用程序的生命周期 spring-boot:build-info生成執行器可以使用的構造信息
6、什么是YAML?
YAML是一種人類可讀的數據序列化語言。它通常用於配置文件。
與屬性文件相比,如果我們想要在配置文件中添加復雜的屬性,YAML文件就更加結構化,而且更少混淆。可以看出YAML具有分層配置數據。
7、SpringBoot自動配置的原理
在Spring程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration會自動去maven中讀取每個starter中的spring.gfactories文件,改文件里配置了所有需要被創建的Spring容器中的bean
8、RequestMapping和GetMapping的不同之處在哪里?
RequestMapping具有類屬性的,可以進行GET、POST、PUT或者其他的注釋中具有的請求方法。
GetMapping是Get請求方法中的一個特例,它只是RequestMapping的一個延伸,目的是為了提高清晰度。
##9、spring-boot-starter-parent有什么作用?
我們知道,新建一個SpringBoot項目,默認都是有parent的,這個parent就是spring-boot-starter-parent,spring-boot-starter-parent主要有如下作用:
- 定義了Java編譯版本為1.8
- 使用UTF-8格式編碼
- 繼承自spring-boor-dependencies,這里面定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號
- 執行打包操作的配置
- 自動化的資源過濾
- 自動化的插件配置
- 針對application.peoperties和application.yuml的資源過濾,包括通過profile定義的不同環境的配置文件,例如application-dev.properties和application-dev.yuml。
10、SpringBoot 打成jar和普通的jar有什么區別?
Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 可以直接通過java -jar xxx.jar
命令來運行,這種 jar 不可以作為普通的 jar 被其他項目依賴,即使依賴了也無法使用其中的類。
Spring Boot 的 jar 無法被其他項目依賴,主要還是他和普通 jar 的結構不同。普通的 jar 包,解壓后直接就是包名,包里就是我們的代碼,而 Spring Boot 打包成的可執行 jar 解壓后,在 \BOOT-INF\classes
目錄下才是我們的代碼,因此無法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。
11、運行SpringBoot有幾種方式?
- 打包用命令或者放到容器中運行
- 用Maven或Gradle插件運行
- 直接執行main方法運行
12、開啟Spring Boot特性有哪幾種方式?
- 繼承spring-boot-starter-parent項目
- 導入spring-boot-dependencies項目依賴
13、什么是Spring Data?
Spring Data 是 Spring 的一個子項目。用於簡化數據庫訪問,支持NoSQL 和 關系數據存儲。其主要目標是使數據庫的訪問變得方便快捷。Spring Data 具有如下特點:
SpringData 項目支持 NoSQL 存儲:
- MongoDB (文檔數據庫)
- Neo4j(圖形數據庫)
- Redis(鍵/值存儲)
- Hbase(列族數據庫)
SpringData 項目所支持的關系數據存儲技術:
- JDBC
- JPA
Spring Data Jpa 致力於減少數據訪問層 (DAO) 的開發量. 開發者唯一要做的,就是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!Spring Data JPA 通過規范方法的名字,根據符合規范的名字來確定方法需要實現什么樣的邏輯。
14、什么是Swagger?你用Spring Boot實現了嗎?
Swagger 廣泛用於可視化 API,使用 Swagger UI 為前端開發人員提供在線沙箱。Swagger 是用於生成 RESTful Web 服務的可視化表示的工具,規范和完整框架實現。它使文檔能夠以與服務器相同的速度更新。當通過 Swagger 正確定義時,消費者可以使用最少量的實現邏輯來理解遠程服務並與其進行交互。因此,Swagger消除了調用服務時的猜測。
15、前后端分離,如何維護接口文檔?
前后端分離開發日益流行,大部分情況下,我們都是通過 Spring Boot 做前后端分離開發,前后端分離一定會有接口文檔,不然會前后端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,所有開發工程師訪問這一個在線網站就可以獲取到最新的接口文檔,非常方便。
16、如何使用Spring Boot實現異常處理?
Spring提供了一種使用ControllerAdvice處理異常的非常有用的方法。通過實現一個ControlerAdvice類,來處理控制類拋出的所有異常。
17、什么是FreeMarker模板?
FreeMarker 是一個基於 Java 的模板引擎,最初專注於使用 MVC 軟件架構進行動態網頁生成。使用 Freemarker 的主要優點是表示層和業務層的完全分離。程序員可以處理應用程序代碼,而設計人員可以處理 html 頁面設計。最后使用freemarker 可以將這些結合起來,給出最終的輸出頁面。
18、如何實現Spring Boot應用程序的安全性?
為了實現Spring Boot的安全性,使用spring-boot-starter-security依賴項,並且必須添加安全配置。它只需要很少代碼。配置類將必須擴展WebSecurityConfigurerAdapter並覆蓋其方法。
##19、比較一下Spring Security和Shiro各自的優缺點?
由於Spring Boot官方提供了大量的非常方便的開箱即用的Starter,包括Spring Security的Starter,使得在SpringBoot中使用Spring Security變得更加容易,甚至只需要添加一個一來就可以保護所有接口,所以如果是SpringBoot項目,一般選擇Spring Security。當然這只是一個建議的組合,單純從技術上來說,無論怎么組合,都是沒有問題的。
Shiro和Spring Security相比,主要有如下特點:
- Spring Security是一個重量級的安全管理框架;Shiro則是一個輕量級的安全管理框架;
- Spring Security概念復雜,配置繁瑣;Shiro概念簡單、配置簡單;
- Spring Security功能強大;Shiro功能簡單
20、Spring Boot中如何解決跨域問題?
跨域可以在前端通過JSONP來解決,但是JSONP只可以發送GET請求,無法發送其他類型的請求,在RESTful風格的應用中,就顯得非常雞肋,因此推薦在后端通過(CORS,Cross-origin resource sharing)來解決跨域問題。這種解決方案並非Spring Boot特有的,在傳統的SSM框架中,就可以通過CORS來解決跨域問題,只不過之前我們是在XML文件中配置CORS,現在可以通過實現WebMvcConfigurer接口然后重寫addCorsMappings方法解決跨域問題。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
項目中前后端分離部署,所以需要解決跨域的問題。
我們使用cookie存放用戶登錄的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。
當用戶登錄以后,正常使用;當用戶退出登錄狀態時或者token過期時,由於攔截器和跨域的順序有問題,出現了跨域的現象。
我們知道一個http請求,先走filter,到達servlet后才進行攔截器的處理
,如果我們把cors放在filter里,就可以優先於權限攔截器執行。
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
21、什么是CSRF攻擊?
CSRF 代表跨站請求偽造。這是一種攻擊,迫使最終用戶在當前通過身份驗證的Web 應用程序上執行不需要的操作。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,因為攻擊者無法查看對偽造請求的響應。
22、Spring Boot的核心注解是哪些?他主由哪幾個注解組成的?
啟動類上面的注解是@SpringBootApplication,他也是SpringBoot的核心注解,主要組合包含了以下3個注解:
- @SpringBootConfiguration:組合了@Configuration注解,實現配置文件的功能;
- @EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項,如關閉數據源自動配置的功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class});
- @ComponentScan:Spring組件掃描。
23、SpringBoot的核心配置文件有哪幾個?他們的區別是什么?
SpringBoot的核心配置文件是application和bootstrap
配置文件。
application配置文件這個容易理解,主要用於Spring Boot項目的自動化配置。
bootstrap配置文件有以下幾個應用場景:
- 使用Spring Cloud Config配置中心時,這時需要在bootstrap配置文件中添加連接到配置中心的配置屬性來加載外部配置中心的配置信息;
- 一些固定的不能被覆蓋的屬性;
- 一些加密/解密的場景
24、SpringBoot有哪幾種讀取配置的方式?
Spring Boot 可 以 通 過 @PropertySource,@Value,@Environment, @ConfigurationProperties 來綁定變量。
25、Spring Boot 支持哪些日志框架?推薦和默認的日志框架是哪個?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作為日志框架,如果你使用Starters 啟動器,Spring Boot 將使用 Logback 作為默認日志框架。
26、保護SpringBoot應用有哪些方法?
- 在生產中使用HTTPS
- 使用Snyk檢查你的依賴關系
- 升級到最新版本
- 啟用CSRF保護
- 使用內容安全策略防止XSS攻擊
27、SpringBoot 2.X有哪些新特性?與1.X有什么區別?
- 配置變更
- JDK版本升級
- 第三方類庫升級
- 響應式Spring編程支持
- HTTP/2支持
- 配置屬性綁定
- 更多改進與加強