javascript
一篇文章带你搞定和Spring Boot有关的那些高频面试题
自Spring Boot誕生以來,就引起了業(yè)界轟動,目前越來越多的公司技術(shù)選型選擇擁抱Spring Boot。所以Spring Boot也成為面試必問的問題之一。下面的問題是小胖哥面試了很多候選人后總結(jié)出來的,希望對你有所幫助
問
? ? ? ? ? ?Spring和Spring Boot有什么區(qū)別?
答
Spring Framework提供了多種功能,使Web應(yīng)用程序的開發(fā)更加容易。這些功能包括依賴注入,數(shù)據(jù)綁定,面向方面的編程,數(shù)據(jù)訪問等等。
隨著Spring社區(qū)的壯大,Spring慢慢變得越來越復(fù)雜,不再像開始宣稱的那么輕量級。開發(fā)應(yīng)用程序的配置量越來越大令開發(fā)者頭疼。這時Spring Boot就派上用場了 - 它采用“約定大于配置”的思想簡化了配置,對Spring提供的功能和配置而且將一些功能抽象成為“Starter”開箱即用、按需引用。極大地簡化了開發(fā)。
問
? ? ? ? ? ? ??我們?nèi)绾问褂肕aven設(shè)置Spring Boot應(yīng)用程序?
答
我們可以像在任何其他庫中一樣在Maven項目中包含Spring Boot。但是,最好的方法是從spring-boot-starter-parent項目繼承并聲明依賴于Spring Boot啟動器。這樣做可以讓我們的項目重用Spring Boot的默認(rèn)設(shè)置。
繼承spring-boot-starter-parent項目非常簡單 - 我們只需要在pom.xml中指定一個parent元素:
我們可以在Maven 中央倉庫找到最新版本的?spring-boot-starter-parent。
上面的方式很方便但是并不一定符合實(shí)際需要。例如公司要求所有項目依賴構(gòu)建從一個標(biāo)準(zhǔn)BOM開始,我們就不能按上面的方式進(jìn)行。
在這種情況下,我們可以進(jìn)行如下引用:
然后在 dependencies 標(biāo)簽下引用Spring Boot 的starters 就行了。
問
? ? ? ? ? ? ? ??Spring boot 中的starter是什么?
答
依賴管理對于項目至關(guān)重要。當(dāng)項目足夠復(fù)雜時,管理依賴項可能會變成一場噩夢,因為涉及的組件太多了。
這就是Spring Boot 的starter就派上用場了。每個starter都可以為我們提供所需要的Spring技術(shù)的一站式服務(wù)。并且以一致的方式傳遞和管理其他所需的依賴關(guān)系。
所有官方starter都在org.springframework.boot組下,其名稱以spring-boot-starter-開頭 。非官方的starter的名稱在前,如mybatis-spring-boot-starter。這種命名模式使得查找啟動器變得很容易,尤其是在使用支持按名稱搜索依賴關(guān)系的IDE時。但是這個不是絕對的,有些開發(fā)者可能不遵從這種契約。
目前大概有超過50種官方starter。最常用的是:
spring-boot-starter:?核心啟動器,包括自動配置支持,日志記錄和YAML
spring-boot-starter-aop:?使用Spring AOP和AspectJ進(jìn)行面向方面編程的初學(xué)者
spring-boot-starter-data-jpa:?使用Spring Data JPA和Hibernate的啟動器
spring-boot-starter-jdbc:?用于將JDBC與HikariCP連接池一起使用的啟動器
spring-boot-starter-security:?使用Spring Security的啟動器
spring-boot-starter-test:?用于測試Spring Boot應(yīng)用程序的啟動器
spring-boot-starter-web:?使用Spring MVC構(gòu)建Web的啟動器,包括RESTful應(yīng)用程序
其他starter 可去spring.io查詢
問
? ? ? ? ? ? ? ??Spring Boot 如何禁用特定的自動配置?
答
如果我們需要禁用特定Spring Boot的自動配置,我們可以使用@EnableAutoConfiguration注解的exclude屬性來指示它。如下禁用了
DataSourceAutoConfiguration:
如果我們使用@SpringBootApplication注解。?它具有@EnableAutoConfiguration作為元注解 - 我們同樣可以配置exclude屬性來禁用自動配置:
我們還可以使用spring.autoconfigure.exclude環(huán)境屬性禁用自動配置。在application.properties配置文件設(shè)置如下也可以達(dá)到同樣的目的:
問
? ? ? ? ? ? ? ??Spring Boot 如何注冊自定義自動配置?
答
要注冊自動配置類,我們必須在META-INF /?
spring.factories文件的EnableAutoConfiguration?鍵
下列出其完全限定名稱,如果是多個按照以下風(fēng)格配置:
如果我們使用Maven構(gòu)建一個項目,那么該文件應(yīng)放在resources / META-INF目錄中。
問
? ? ? ? ? ? ? ??Spring Boot如何根據(jù)不同的條件來加載bean?
答
?
你可在配置中使用@Conditional 系列注解。例如@ConditionalOnMissingBean。此注釋的最顯著屬性是:
value:要檢查的bean類型
name:要檢查的bean的名稱
放置在使用@Bean裝飾的方法上時,目標(biāo)類型默認(rèn)為方法的返回類型:
表示的意思是如果不存在CustomService類型的bean則初始化并注入該bean。
問
? ? ? ? ? ? ? ???如何將Spring Boot Web應(yīng)用程序部署為JAR和 WAR文件?
答
傳統(tǒng)上,我們將Web應(yīng)用程序打包為WAR文件,然后將其部署到外部服務(wù)器中。這樣做可以讓我們在同一臺服務(wù)器上安排多個應(yīng)用程序。在CPU和內(nèi)存稀缺的時候,這是節(jié)省資源的好方法。
但事情發(fā)生了變化。現(xiàn)在計算機(jī)硬件相當(dāng)便宜,并且注意力轉(zhuǎn)向服務(wù)器配置。在部署期間配置服務(wù)器的一個小錯誤可能會導(dǎo)致災(zāi)難性后果。
Spring通過提供一個插件即spring-boot-maven-plugin來解決這個問題,將Web應(yīng)用程序打包為可執(zhí)行的JAR。要包含此插件,只需向pom.xml添加一個插件元素:
有了這個插件,我們將在執(zhí)行包階段后得到一個fat JAR 。此JAR包含所有必需的依賴項,包括嵌入式服務(wù)器。因此,我們不再需要擔(dān)心配置外部服務(wù)器。
然后我們可以像運(yùn)行普通的可執(zhí)行JAR一樣運(yùn)行應(yīng)用程序。
請注意,必須將pom.xml文件中的packaging元素設(shè)置為?jar?才能構(gòu)建JAR文件:
如果我們不包含這個元素,它也默認(rèn)為jar。
如果我們想要構(gòu)建WAR文件,請將包裝?元素更改為war:
并將容器依賴關(guān)系從打包文件中刪除:
執(zhí)行Maven?包階段后,我們將擁有一個可部署的WAR文件。
問
? ? ? ? ? ? ? ???如何在Spring Boot啟動的時候運(yùn)行一些邏輯?
答
可以實(shí)現(xiàn)Spring Boot 提供的接口 ApplicationRunner ?也可以實(shí)現(xiàn)接口CommandLineRunner,這兩個接口實(shí)現(xiàn)方式一樣,它們都只提供了一個 run 方法。
問
? ? ? ? ? ? ? ? ???Spring boot支持哪些外部配置?
答
Spring Boot支持外部配置,允許我們在各種環(huán)境中運(yùn)行相同的應(yīng)用程序。我們可以使用properties文件,YAML文件,環(huán)境變量,系統(tǒng)屬性和命令行選項參數(shù)來指定配置屬性。
然后,我們可以訪問使用這些屬性@Value注釋,經(jīng)由綁定對象 的@ConfigurationProperties注釋,或Environment 環(huán)境抽象類注入。
以下是最常見的外部配置來源:
命令行屬性:命令行選項參數(shù)是以雙連字符開頭的程序參數(shù),例如-server.port = 8080。Spring Boot將所有參數(shù)轉(zhuǎn)換為屬性,并將它們添加到環(huán)境屬性集中。
應(yīng)用程序?qū)傩?#xff1a;應(yīng)用程序?qū)傩允菑腶pplication.properties文件或其YAML對應(yīng)文件加載的屬性。默認(rèn)情況下,Spring Boot會在當(dāng)前目錄,類路徑根或其config子目錄中搜索此文件。
特定于配置文件的屬性:特定于配置文件的屬性從application- {profile} .properties文件或其YAML對應(yīng)文件加載。{profile}占位符是指活性輪廓。這些文件與非特定屬性文件位于相同位置,并且優(yōu)先于非特定屬性文件。
問
? ? ? ? ? ? ? ? ??Spring和Spring Boot有什么區(qū)別?
答
在為Spring應(yīng)用程序運(yùn)行集成測試時,我們必須有一個ApplicationContext。
為了簡化測試,Spring Boot為測試提供了一個特殊的注釋?@SpringBootTest。此批注從其classes屬性指示的配置類創(chuàng)建ApplicationContext。
如果未設(shè)置classes屬性,Spring Boot將搜索主配置類。搜索從包含測試的包開始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注釋的類。
請注意,如果我們使用JUnit 4,我們必須用@RunWith(SpringRunner.class)裝飾測試類。可以查閱我前面的關(guān)于Spring Boot Mock測試的文章來學(xué)習(xí)更多的測試方式。
問
? ? ? ? ? ?Spring Boot Actuator有什么用?
答
Spring Boot Actuator可以幫助你監(jiān)控和管理Spring Boot應(yīng)用,比如健康檢查、審計、統(tǒng)計和HTTP追蹤等。所有的這些特性可以通過JMX或者HTTP endpoints來獲得。
Actuator同時還可以與外部應(yīng)用監(jiān)控系統(tǒng)整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。這些系統(tǒng)提供了非常好的儀表盤、圖標(biāo)、分析和告警等功能,使得你可以通過統(tǒng)一的接口輕松的監(jiān)控和管理你的應(yīng)用。
Actuator使用Micrometer來整合上面提到的外部應(yīng)用監(jiān)控系統(tǒng)。這使得只要通過非常小的配置就可以集成任何應(yīng)用監(jiān)控系統(tǒng)。
將Spring Boot Actuator集成到一個項目中非常簡單。我們需要做的就是在pom.xml文件中包含?spring-boot-starter-actuator啟動器:
Spring Boot Actuator可以使用HTTP或JMX端點(diǎn)公開操作信息。但是,大多數(shù)應(yīng)用程序都使用HTTP,其中端點(diǎn)的標(biāo)識和/執(zhí)行器前綴形成URL路徑。
以下是Actuator提供的一些最常見的內(nèi)置端點(diǎn):
auditevents:?公開審計事件信息
env:?公開環(huán)境屬性
health:?顯示應(yīng)用程序運(yùn)行狀況信息
httptrace:?顯示HTTP跟蹤信息
info:?顯示任意應(yīng)用程序信息
metric:?顯示指標(biāo)信息
mapping:?顯示所有@RequestMapping路徑的列表
scheduledtasks:?顯示應(yīng)用程序中的計劃任務(wù)
threaddump:?執(zhí)行線程轉(zhuǎn)儲
beans :所有加載的spring bean
生產(chǎn)使用Actuator務(wù)必保護(hù)好這些端點(diǎn),避免未授權(quán)的訪問請求。
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的一篇文章带你搞定和Spring Boot有关的那些高频面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程桌面连接CentOS7
- 下一篇: gradle idea java ssm