SpringBoot面試題及答案整理

1. Spring 和 SpringBoot 有什麼不一樣?

Spring 框架提供多種特性使得 web 應用開發變得更簡便,包括依賴注入、數據綁定、切面編程、數據存取等等。web

隨着時間推移,Spring 生態變得愈來愈複雜了,而且應用程序所必須的配置文件也使人以爲可怕。這就是 Spirng Boot 派上用場的地方了 – 它使得 Spring 的配置變得更垂手可得。spring

實際上,Spring 是 unopinionated(予以配置項多,傾向性弱) 的,Spring Boot 在平臺和庫的作法中更 opinionated ,使得咱們更容易上手。編程

這裏有兩條 SpringBoot 帶來的好處:瀏覽器

  • 根據 classpath 中的 artifacts 的自動化配置應用程序
  • 提供非功能性特性例如安全和健康檢查給到生產環境中的應用程序

2. 怎麼使用 Maven 來構建一個 SpringBoot 程序?

就像引入其餘庫同樣,咱們能夠在 Maven 工程中加入 SpringBoot 依賴。然而,最好是從 spring-boot-starter-parent 項目中繼承以及聲明依賴到 Spring Boot starters。這樣作可使咱們的項目能夠重用 SpringBoot 的默認配置。緩存

繼承 spring-boot-starter-parent 項目依賴很簡單 – 咱們只須要在 pom.xml 中定義一個 parent 節點:tomcat

1 <parent>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-parent</artifactId>
4     <version>2.1.1.RELEASE</version>
5 </parent>

咱們能夠在 Maven central 中找到 spring-boot-starter-parent 的最新版本。安全

使用 starter 父項目依賴很方便,但並不是老是可行。例如,若是咱們公司都要求項目繼承標準 POM,咱們就不能依賴 SpringBoot starter 了。服務器

這種狀況,咱們能夠經過對 POM 元素的依賴管理來處理:restful

 1 <dependencyManagement>
 2     <dependencies>
 3         <dependency>
 4             <groupId>org.springframework.boot</groupId>
 5             <artifactId>spring-boot-dependencies</artifactId>
 6             <version>2.1.1.RELEASE</version>
 7             <type>pom</type>
 8             <scope>import</scope>
 9         </dependency>
10     </dependencies>
11 </dependencyManagement>

最後,咱們能夠添加 SpringBoot starter 中一些依賴,而後咱們就能夠開始了。app

3. SpringBoot starter 做用在什麼地方?

依賴管理是全部項目中相當重要的一部分。當一個項目變得至關複雜,管理依賴會成爲一個噩夢,由於當中涉及太多 artifacts 了。

這時候 SpringBoot starter 就派上用處了。每個 stater 都在扮演着提供咱們所需的 Spring 特性的一站式商店角色。其餘所需的依賴以一致的方式注入而且被管理。

全部的 starter 都歸於 org.springframework.boot 組中,而且它們都以由 spring-boot-starter- 開頭取名。這種命名方式使得咱們更容易找到 starter 依賴,特別是當咱們使用那些支持經過名字查找依賴的 IDE 當中

在寫這篇文章的時候,已經有超過50個 starter了,其中最經常使用的是:

  • spring-boot-starter:核心 starter,包括自動化配置支持,日誌以及 YAML
  • spring-boot-starter-aop:Spring AOP 和 AspectJ 相關的切面編程 starter
  • spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
  • spring-boot-starter-jdbc:使用 HikariCP 鏈接池 JDBC 的 starter
  • spring-boot-starter-security:使用 Spring Security 的 starter
  • spring-boot-starter-test:SpringBoot 測試相關的 starter
  • spring-boot-starter-web:構建 restful、springMVC 的 web應用程序的 starter

4. 怎麼禁用某些自動配置特性?

若是咱們想禁用某些自動配置特性,可使用 @EnableAutoConfiguration 註解的 exclude 屬性來指明。例如,下面的代碼段是使 DataSourceAutoConfiguration 無效:

1 // other annotations
2 @EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

若是咱們使用 @SpringBootApplication 註解 — 那個將 @EnableAutoConfiguration 做爲元註解的項,來啓用自動化配置,咱們可以使用相同名字的屬性來禁用自動化配置:

1 // other annotations
2 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
3 public class MyConfiguration { }

咱們也可以使用 spring.autoconfigure.exclude 環境屬性來禁用自動化配置。application.properties 中的這項配置可以像之前那樣作一樣的事情:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

5. 怎麼註冊一個定製的自動化配置?

爲了註冊一個自動化配置類,咱們必須在 META-INF/spring.factories 文件中的 EnableAutoConfiguration 鍵下列出它的全限定名:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfigure.CustomAutoConfiguration

若是咱們使用 Maven 構建項目,這個文件須要放置在在 package 階段被寫入完成的 resources/META-INF 目錄中。

6. 當 bean 存在的時候怎麼置後執行自動配置?

爲了當 bean 已存在的時候通知自動配置類置後執行,咱們可使用 @ConditionalOnMissingBean 註解。這個註解中最值得注意的屬性是:

  • value:被檢查的 beans 的類型
  • name:被檢查的 beans 的名字

當將 @Bean 修飾到方法時,目標類型默認爲方法的返回類型:

1 @Configuration
2 public class CustomConfiguration {
3     @Bean
4     @ConditionalOnMissingBean
5     public CustomService service() { ... }
6 }

7. 怎麼將 SpringBoot web 應用程序部署爲 JAR 或 WAR 文件?

一般,咱們將 web 應用程序打包成 WAR 文件,而後將它部署到另外的服務器上。這樣作使得咱們可以在相同的服務器上處理多個項目。當 CPU 和內存有限的狀況下,這是一種最好的方法來節省資源。

然而,事情發生了轉變。如今的計算機硬件相比起來已經很便宜了,而且如今的注意力大多轉移到服務器配置上。部署中對服務器配置的一個細小的失誤都會致使無可預料的災難發生。

Spring 經過提供插件來解決這個問題,也就是 spring-boot-maven-plugin 來打包 web 應用程序到一個額外的 JAR 文件當中。爲了引入這個插件,只須要在 pom.xml 中添加一個 plugin 屬性:

1 <plugin>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-maven-plugin</artifactId>
4 </plugin>

有了這個插件,咱們會在執行 package 步驟後獲得一個 JAR 包。這個 JAR 包包含所需的全部依賴以及一個嵌入的服務器。所以,咱們再也不須要擔憂去配置一個額外的服務器了。

咱們可以經過運行一個普通的 JAR 包來啓動應用程序。

注意一點,爲了打包成 JAR 文件,pom.xml 中的 packgaing 屬性必須定義爲 jar

<packaging>jar</packaging>

若是咱們不定義這個元素,它的默認值也爲 jar

若是咱們想構建一個 WAR 文件,將 packaging 元素修改成 war

<packaging>war</packaging>

而且將容器依賴從打包文件中移除:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-tomcat</artifactId>
4     <scope>provided</scope>
5 </dependency>

執行 Maven 的 package 步驟以後,咱們獲得一個可部署的 WAR 文件。

8. 怎麼使用 SpringBoot 去執行命令行程序?

像其餘 Java 程序同樣,一個 SpringBoot 命令行程序必需要有一個 main 方法。這個方法做爲一個入口點,經過調用 SpringApplication#run 方法來驅動程序執行:

1 @SpringBootApplication
2 public class MyApplication {
3     public static void main(String[] args) {
4         SpringApplication.run(MyApplication.class);
5         // other statements
6     }
7 }

SpringApplication 類會啓動一個 Spirng 容器以及自動化配置 beans。

要注意的是咱們必須把一個配置類傳遞到 run 方法中做爲首要配置資源。按照慣例,這個參數通常是入口類自己。

在調用 run 方法以後,咱們能夠像日常的程序同樣執行其餘語句。

9. 有什麼外部配置的可能來源?

SpringBoot 對外部配置提供了支持,容許咱們在不一樣環境中運行相同的應用。咱們可使用 properties 文件、YAML 文件、環境變量、系統參數和命令行選項參數來聲明配置屬性。

而後咱們能夠經過 @Value 這個經過 @ConfigurationProperties 綁定的對象的註解或者實現 Enviroment 來訪問這些屬性。

如下是最經常使用的外部配置來源:

  • 命令行屬性:命令行選項參數是以雙連字符(例如,=)開頭的程序參數,例如 –server.port=8080。SpringBoot將全部參數轉換爲屬性而且添加到環境屬性當中。
  • 應用屬性:應用屬性是指那些從 application.properties 文件或者其 YAML 副本中得到的屬性。默認狀況下,SpringBoot會從當前目錄、classpath 根目錄或者它們自身的 config 子目錄下搜索該文件。
  • 特定 profile 配置:特殊概要配置是從 application-{profile}.properties 文件或者自身的 YAML 副本。{profile} 佔位符引用一個在用的 profile。這些文件與非特定配置文件位於相同的位置,而且優先於它們。

10. SpringBoot 支持鬆綁定表明什麼?

SpringBoot中的鬆綁定適用於配置屬性的類型安全綁定。使用鬆綁定,環境屬性的鍵不須要與屬性名徹底匹配。這樣就能夠用駝峯式、短橫線式、蛇形式或者下劃線分割來命名。

例如,在一個有 @ConfigurationProperties 聲明的 bean 類中帶有一個名爲 myProp 的屬性,它能夠綁定到如下任何一個參數中,myPropmy-propmy_prop 或者 MY_PROP

11. SpringBoot DevTools 的用途是什麼?

SpringBoot 開發者工具,或者說 DevTools,是一系列可讓開發過程變得簡便的工具。爲了引入這些工具,咱們只須要在 POM.xml 中添加以下依賴:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-devtools</artifactId>
4 </dependency>

spring-boot-devtools 模塊在生產環境中是默認禁用的,archives 的 repackage 在這個模塊中默認也被排除。所以,它不會給咱們的生產環境帶來任何開銷。

一般來講,DevTools 應用屬性適合於開發環境。這些屬性禁用模板緩存,啓用 web 組的調試日誌記錄等等。最後,咱們能夠在不設置任何屬性的狀況下進行合理的開發環境配置。

每當 classpath 上的文件發生更改時,使用 DevTools 的應用程序都會從新啓動。這在開發中很是有用,由於它能夠爲修改提供快速的反饋。

默認狀況下,像視圖模板這樣的靜態資源修改後是不會被重啓的。相反,資源的更改會觸發瀏覽器刷新。注意,只有在瀏覽器中安裝了 LiveReload 擴展並以與 DevTools 所包含的嵌入式 LiveReload 服務器交互時,纔會發生。

12. 怎麼編寫一個集成測試?

當咱們使用 Spring 應用去跑一個集成測試時,咱們須要一個 ApplicationContext

爲了使咱們開發更簡單,SpringBoot 爲測試提供一個註解 – @SpringBootTest。這個註釋由其 classes 屬性指示的配置類建立一個 ApplicationContext

若是沒有配置 classes 屬性,SpringBoot 將會搜索主配置類。搜索會從包含測試類的包開始直到找到一個使用 @SpringBootApplication 或者 @SpringBootConfiguration 的類爲止。

注意若是使用 JUnit4,咱們必須使用 @RunWith(SpringRunner.class) 來修飾這個測試類。

13. SpringBoot的 Actuator 是作什麼的?

本質上,Actuator 經過啓用 production-ready 功能使得 SpringBoot 應用程序變得更有生命力。這些功能容許咱們對生產環境中的應用程序進行監視和管理。

集成 SpringBoot Actuator 到項目中很是簡單。咱們須要作的只是將 spring-boot-starter-actuator starter 引入到 POM.xml 文件當中:

1 <dependency>
2     <groupId>org.springframework.boot</groupId>
3     <artifactId>spring-boot-starter-actuator</artifactId>
4 </dependency>

SpringBoot Actuaor 可使用 HTTP 或者 JMX endpoints來瀏覽操做信息。大多數應用程序都是用 HTTP,做爲 endpoint 的標識以及使用 /actuator 前綴做爲 URL路徑。

這裏有一些經常使用的內置 endpoints Actuator:

  • auditevents:查看 audit 事件信息
  • env:查看 環境變量
  • health:查看應用程序健康信息
  • httptrace:展現 HTTP 路徑信息
  • info:展現 arbitrary 應用信息
  • metrics:展現 metrics 信息
  • loggers:顯示並修改應用程序中日誌器的配置
  • mappings:展現全部 @RequestMapping 路徑信息
  • scheduledtasks:展現應用程序中的定時任務信息
  • threaddump:執行 Thread Dump
相關文章
相關標籤/搜索