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