2019阿里P7最新總結(jié)Spring Boot面試問(wèn)題

Spring Boot一直是Spring生態(tài)系統(tǒng)的關(guān)鍵參與者。該項(xiàng)目通過(guò)其自動(dòng)配置功能使我們的生活更加輕松。在本教程中,我們將介紹在求職面試中可能出現(xiàn)的一些與Spring Boot相關(guān)的最常見(jiàn)問(wèn)題。

Spring和Spring Boot有什么區(qū)別?

Spring Framework提供了多種功能,使Web應(yīng)用程序的開(kāi)發(fā)更加容易。這些功能包括依賴注入,數(shù)據(jù)綁定,面向方面的編程,數(shù)據(jù)訪問(wèn)等等。

多年來(lái),Spring變得越來(lái)越復(fù)雜,這種應(yīng)用程序所需的配置量可能會(huì)令人生畏。這就是Spring Boot派上用場(chǎng)的地方 - 它使配置Spring應(yīng)用程序變得輕而易舉。

從本質(zhì)上講,雖然Spring是不受歡迎的,但Spring Boot對(duì)平臺(tái)和庫(kù)有了自己的看法,讓我們快速入門(mén)。

以下是Spring Boot帶來(lái)的兩個(gè)最重要的好處:

  • 根據(jù)在類路徑中找到的工件自動(dòng)配置應(yīng)用程序
  • 提供生產(chǎn)中應(yīng)用程序通用的非功能性功能,例如安全性或健康檢查

我們?nèi)绾问褂肕aven設(shè)置Spring Boot應(yīng)用程序?

我們可以像在任何其他庫(kù)中一樣在Maven項(xiàng)目中包含Spring Boot。但是,最好的方法是從spring-boot-starter-parent項(xiàng)目繼承并聲明對(duì)Spring Boot啟動(dòng)器的依賴。這樣做可以讓我們的項(xiàng)目重用Spring Boot的默認(rèn)設(shè)置。

繼承spring-boot-starter-parent項(xiàng)目非常簡(jiǎn)單 - 我們只需要在pom.xml中指定一個(gè)父元素:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>

我們可以在Maven Central找到最新版本的 spring-boot-starter-parent。

使用啟動(dòng)父項(xiàng)目很方便,但并不總是可行。例如,如果我們公司要求所有項(xiàng)目都從標(biāo)準(zhǔn)POM繼承,我們就不能依賴Spring Boot的啟動(dòng)父級(jí)。

在這種情況下,我們?nèi)匀豢梢酝ㄟ^(guò)此POM元素獲得依賴關(guān)系管理的好處:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

有什么Spring Boot啟動(dòng)器可供選擇嗎?

依賴管理是任何項(xiàng)目的關(guān)鍵方面。當(dāng)項(xiàng)目足夠復(fù)雜時(shí),管理依賴項(xiàng)可能會(huì)變成一場(chǎng)噩夢(mèng),因?yàn)樯婕暗墓ぜ嗔恕?/p>

這是Spring Boot入門(mén)者派上用場(chǎng)的地方。每個(gè)入門(mén)者都可以作為我們所需的所有Spring技術(shù)的一站式服務(wù)。然后,以一致的方式傳遞和管理其他所需的依賴關(guān)系。

所有啟動(dòng)器都在org.springframework.boot組下,其名稱以spring-boot-starter-開(kāi)頭 。這種命名模式使您可以輕松找到啟動(dòng)器,尤其是在使用支持按名稱搜索依賴關(guān)系的IDE時(shí)。

在撰寫(xiě)本文時(shí),我們有超過(guò)50個(gè)啟動(dòng)器。最常用的是:

  • spring-boot-starter: 核心啟動(dòng)器,包括自動(dòng)配置支持,日志記錄和YAML
  • spring-boot-starter-aop: 使用Spring AOP和AspectJ進(jìn)行面向方面編程的啟動(dòng)器
  • spring-boot-starter-data-jpa: 使用Spring Data JPA和Hibernate的啟動(dòng)器
  • spring-boot-starter-jdbc: 用于將JDBC與HikariCP連接池一起使用的啟動(dòng)器
  • spring-boot-starter-security: 使用Spring Security的啟動(dòng)器
  • spring-boot-starter-test: 用于測(cè)試Spring Boot應(yīng)用程序的啟動(dòng)器
  • spring-boot-starter-web: 用于構(gòu)建Web的入門(mén)者,包括使用Spring MVC的RESTful應(yīng)用程序

如何禁用特定的自動(dòng)配置?

如果我們要禁用特定的自動(dòng)配置,我們可以使用@EnableAutoConfiguration批注的exclude屬性來(lái)指示它

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

如果我們使用@SpringBootApplication批注啟用自動(dòng)配置- 它具有@EnableAutoConfiguration作為元注釋 - 我們可以使用相同名稱的屬性禁用自動(dòng)配置:

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

我們還可以使用spring.autoconfigure.exclude環(huán)境屬性禁用自動(dòng)配置。application.properties文件中的此設(shè)置與以前相同:

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

如何注冊(cè)自定義自動(dòng)配置?

要注冊(cè)自動(dòng)配置類,我們必須在META-INF / spring.factories文件中的EnableAutoConfiguration鍵下列出其完全限定名稱:

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

如果我們使用Maven構(gòu)建一個(gè)項(xiàng)目,那么該文件應(yīng)放在resources / META-INF目錄中,該目錄將在程序打包階段找到該文件。

如何告訴自動(dòng)配置在bean已經(jīng)存在情況下退回?

要指示自動(dòng)配置類在bean已經(jīng)存在時(shí)退出,我們可以使用 @ConditionalOnMissingBean批注。此注釋的最顯著屬性是:

  • value:要檢查的bean類型
  • name:要檢查的bean的名稱

放置在使用@Bean裝飾的方法上時(shí),目標(biāo)類型默認(rèn)為方法的返回類型:

@Configuration
public class CustomConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public CustomService service() { ... }
}

如何將Spring Boot Web應(yīng)用程序部署為JAR和WAR文件?

傳統(tǒng)上,我們將Web應(yīng)用程序打包為WAR文件,然后將其部署到外部服務(wù)器中。這樣做可以讓我們?cè)谕慌_(tái)服務(wù)器上安排多個(gè)應(yīng)用程序。在CPU和內(nèi)存稀缺的時(shí)候,這是節(jié)省資源的好方法。

但事情發(fā)生了變化。計(jì)算機(jī)硬件現(xiàn)在相當(dāng)便宜,而且注意力轉(zhuǎn)向服務(wù)器配置。在部署期間配置服務(wù)器的一個(gè)小錯(cuò)誤可能會(huì)導(dǎo)致災(zāi)難性后果。

Spring通過(guò)提供一個(gè)插件即spring-boot-maven-plugin來(lái)解決這個(gè)問(wèn)題,將Web應(yīng)用程序打包為可執(zhí)行的JAR。要包含此插件,只需向pom.xml添加一個(gè)插件元素:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

有了這個(gè)插件,我們將在執(zhí)行打包階段后生成一個(gè)胖JAR 。此JAR包含所有必需的依賴項(xiàng),包括嵌入式服務(wù)器。因此,我們不再需要擔(dān)心配置外部服務(wù)器。

然后我們就像普通的可執(zhí)行JAR一樣運(yùn)行應(yīng)用程序。

請(qǐng)注意,必須將pom.xml文件中的packaging元素設(shè)置為 jar 才能構(gòu)建JAR文件:

<packaging>jar</packaging>

執(zhí)行Maven 打包階段后,我們將擁有一個(gè)可部署的WAR文件。

如何將Spring Boot用于命令行應(yīng)用程序?

與任何其他Java程序一樣,Spring Boot命令行應(yīng)用程序必須具有 main方法。此方法用作入口點(diǎn),它調(diào)用SpringApplication#run方法來(lái)引導(dǎo)應(yīng)用程序:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class);
        // other statements
    }
}

然后SpringApplication類啟動(dòng)一個(gè)Spring容器并自動(dòng)配置bean。

請(qǐng)注意,我們必須將配置類傳遞給run方法才能用作主要配置源。按照慣例,這個(gè)參數(shù)是入門(mén)類本身。

在調(diào)用run方法之后,我們可以像在常規(guī)程序中那樣執(zhí)行其他語(yǔ)句。

有哪些可能的外部配置源?

Spring Boot支持外部配置,允許我們?cè)诟鞣N環(huán)境中運(yùn)行相同的應(yīng)用程序。我們可以使用屬性文件,YAML文件,環(huán)境變量,系統(tǒng)屬性和命令行選項(xiàng)參數(shù)來(lái)指定配置屬性。

然后,我們可以訪問(wèn)使用這些屬性@Value注釋,經(jīng)由綁定對(duì)象 的@ConfigurationProperties注釋,或環(huán)境抽象。

以下是最常見(jiàn)的外部配置來(lái)源:

  • 命令行屬性:命令行選項(xiàng)參數(shù)是以雙連字符開(kāi)頭的程序參數(shù),例如-server.port = 8080。Spring Boot將所有參數(shù)轉(zhuǎn)換為屬性,并將它們添加到環(huán)境屬性集中。
  • 應(yīng)用程序?qū)傩裕簯?yīng)用程序?qū)傩允菑腶pplication.properties文件或其YAML對(duì)應(yīng)文件加載的屬性。默認(rèn)情況下,Spring Boot會(huì)在當(dāng)前目錄,類路徑根或其config子目錄中搜索此文件。
  • 特定于配置文件的屬性:特定于配置文件的屬性從application- {profile} .properties文件或其YAML對(duì)應(yīng)文件加載。{profile}是指激活的Profile名稱。這些文件與非特定屬性文件位于相同位置,并且優(yōu)先于非特定屬性文件。

Spring Boot支持輕松綁定是什么意思?

Spring Boot中的輕松綁定適用于配置屬性的類型安全綁定。

使用寬松綁定時(shí),環(huán)境屬性的鍵不需要與屬性名稱完全匹配。這樣的環(huán)境屬性可以用駝峰camelCase,kebab-case,snake_case或大寫(xiě)字母寫(xiě)成,單詞用下劃線分隔。

例如,如果具有@ConfigurationProperties批注的bean類中的屬性名為myProp,則可以將其綁定到以下任何環(huán)境屬性:myProp,my-prop,my_prop或MY_PROP。

什么是Spring Boot DevTools?

Spring Boot Developer Tools或DevTools是一組工具,使開(kāi)發(fā)過(guò)程更容易。要包含這些開(kāi)發(fā)時(shí)功能,我們只需要在pom.xml文件中添加依賴項(xiàng):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

在生產(chǎn)運(yùn)行模塊,Spring Boot devtools將自動(dòng)禁用。默認(rèn)情況下,重新打包存檔也會(huì)排除此模塊。因此,它不會(huì)給我們的最終產(chǎn)品帶來(lái)任何開(kāi)銷(xiāo)。

默認(rèn)情況下,DevTools應(yīng)用適合開(kāi)發(fā)環(huán)境的屬性。這些屬性禁用模板緩存,為Web組啟用調(diào)試日志記錄,等等。因此,我們擁有這種合理的開(kāi)發(fā)時(shí)配置,而無(wú)需設(shè)置任何屬性。

只要類路徑上的文件發(fā)生更改,使用DevTools的應(yīng)用程序就會(huì)重新啟動(dòng)。這是開(kāi)發(fā)中非常有用的功能,因?yàn)樗梢钥焖俜答佇薷摹?/p>

默認(rèn)情況下,靜態(tài)資源(包括視圖模板)不會(huì)啟動(dòng)重新啟動(dòng)。相反,資源更改會(huì)觸發(fā)瀏覽器刷新。請(qǐng)注意,只有在瀏覽器中安裝LiveReload擴(kuò)展以與DevTools包含的嵌入式LiveReload服務(wù)器進(jìn)行交互時(shí),才會(huì)發(fā)生這種情況。

Idea中要通過(guò)運(yùn)行配置進(jìn)行專門(mén)配置。

如何編寫(xiě)集成測(cè)試?

在為Spring應(yīng)用程序運(yùn)行集成測(cè)試時(shí),我們必須有一個(gè)ApplicationContext。

為了讓我們的生活更輕松,Spring Boot為測(cè)試提供了一個(gè)特殊的注釋 - @SpringBootTest。此批注從其classes屬性指示的配置類創(chuàng)建ApplicationContext。

如果未設(shè)置classes屬性,Spring Boot將搜索主配置類。搜索從包含測(cè)試的包開(kāi)始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注釋的類。

請(qǐng)注意,如果我們使用JUnit 4,我們必須使用@RunWith(SpringRunner.class)修飾測(cè)試類。

什么是Spring Boot Actuator

從本質(zhì)上講,Actuator通過(guò)支持生產(chǎn)就緒功能,將Spring Boot應(yīng)用程序變?yōu)楝F(xiàn)實(shí)。這些功能使我們能夠在生產(chǎn)中運(yùn)行時(shí)監(jiān)控和管理應(yīng)用程序。

將Spring Boot Actuator集成到一個(gè)項(xiàng)目中非常簡(jiǎn)單。我們需要做的就是在pom.xml文件中包含 spring-boot-starter-actuator starter :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Boot Actuator可以使用HTTP或JMX端點(diǎn)公開(kāi)操作信息。但是,大多數(shù)應(yīng)用程序都使用HTTP,其中端點(diǎn)的標(biāo)識(shí)和/執(zhí)行器前綴形成URL路徑。

以下是Actuator提供的一些最常見(jiàn)的內(nèi)置端點(diǎn):

  • auditevents: 公開(kāi)審計(jì)事件信息
  • env: 公開(kāi)環(huán)境屬性
  • health: 顯示應(yīng)用程序運(yùn)行狀況信息
  • httptrace: 顯示HTTP跟蹤信息
  • info: 顯示任意應(yīng)用程序信息
  • metrics: 顯示指標(biāo)信息
  • loggers: 顯示和修改應(yīng)用程序中記錄器的配置
  • mappings: 顯示所有@RequestMapping路徑的列表
  • scheduledtasks: 顯示應(yīng)用程序中的計(jì)劃任務(wù)
  • threaddump: 執(zhí)行線程轉(zhuǎn)儲(chǔ)

???????本教程介紹了您在技術(shù)面試中可能遇到的一些關(guān)于Spring Boot的最關(guān)鍵問(wèn)題。我們希望他們能幫助您找到理想的工作。

歡迎大家加入粉絲群:963944895,群內(nèi)免費(fèi)分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務(wù)、Dubbo框架、Redis緩存、RabbitMq消息、JVM調(diào)優(yōu)、Tomcat容器、MySQL數(shù)據(jù)庫(kù)教學(xué)視頻及架構(gòu)學(xué)習(xí)思維導(dǎo)圖

寫(xiě)在最后:

既然看到這里了,覺(jué)得筆者寫(xiě)的還不錯(cuò)的就點(diǎn)個(gè)贊,加個(gè)關(guān)注唄!點(diǎn)關(guān)注,不迷路,持續(xù)更新?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容