面試被問爲什麼使用Spring Boot?答案好像沒那麼簡單

公衆號[JavaQ]原創,專注分享Java基礎原理分析、實戰技術、微服務架構、分佈式系統構建,誠邀點贊關注!

面試官:項目中有使用Spring Boot嗎?

小小白:用過。

面試官:說一下爲什麼要使用Spring Boot?

小小白:在使用Spring框架進行開發的過程中,需要配置很多Spring框架包的依賴,如spring-core、spring-bean、spring-context等,而這些配置通常都是重複添加的,而且需要做很多框架使用及環境參數的重複配置,如開啓註解、配置日誌等。Spring Boot致力於弱化這些不必要的操作,提供默認配置,當然這些默認配置是可以按需修改的,快速搭建、開發和運行Spring應用。

面試官:有人說Spring Boot是微服務的框架,你認爲是嗎?

小小白:Spring Boot是Spring家族的成員,它是一個全新的框架,它的設計目的是儘可能簡單和快速的開發、運行Spring應用程序,簡化配置。它爲開發者快捷的使用Spring及相關開發框架提供了便利,但是它並不是微服務的框架,它只是爲微服務框架的使用也提供了很好的腳手架。

面試官:Spring Boot中的Starter是什麼?

小小白:Spring Boot中的Starter是一個包含很多依賴描述的集合,只要添加一個Starter,這個Starter裏面約定的依賴都會被添加到項目中,例如代碼添加了spring-boot-starter-web,執行maven操作就會下載web應用需要的依賴jar。開發者通過使用這些Starter可以快速的搭建開發環境,自動加載所需要的依賴和配置參數屬性。

面試官:你剛剛說到使用Spring Boot快速搭建開發環境,是不是需要從無到有手動搭建?

小小白:如果想快速搭建項目開發環境,可以通過Spring Initializr[http://start.spring.io/]引導快速構建項目。最近阿里也開源了Aliyun Java Initializr[https://start.aliyun.com/],也可以通過它的引導快速構建Java項目。

面試官:Spring Boot中@EnableAutoConfiguration註解有什麼作用?

小小白:@EnableAutoConfiguration註解從字面上理解是開啓自動配置,在@EnableAutoConfiguration註解的定義中使用了@Import註解,使用@Import導入EnableAutoConfigurationImportSelector.class,作用等同於在Spring的xml文件中使用<import/>導入,查看EnableAutoConfigurationImportSelector源碼會發現它就是用於處理@EnableAutoConfiguration註解的,不過在Spring Boot1.5版本開始被標記爲棄用,使用AutoConfigurationImportSelector代替,也就是它的父類,在這個類中將在classpath下jar包中META-INF目錄下搜索spring.factories文件,然後在spring.factories文件中查找以org.springframework.boot.autoconfigure.EnableAutoConfiguration爲key的值,值是一個列表,列表中記錄的是需要進行自動化配置的類會被執行,例如AopAutoConfiguration會自動配置Aop相關配置,使用JDK代理還是CGLIB代理。

面試官:那這個自動化配置是如何觸發的?

小小白:ConfigurationClassPostProcessor類的postProcessBeanFactory方法中調用了ConfigurationClassParser類的parse方法,而ConfigurationClassParser類的parse方法間接調用了AutoConfigurationImportSelector類。這個ConfigurationClassPostProcessor實現了BeanDefinitionRegistryPostProcessor接口,而BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor接口,熟悉Spring原理的都知道BeanFactoryPostProcessor接口中的postProcessBeanFactory方法會在Spring容器加載bean的定義文件之後,在bean實例化之前執行,而這一步是由SpringApplication的run方法觸發的,在這個run方法中實現了Spring容器的啓動及初始化。 

面試官:有些開發者會在pom.xml中繼承spring-boot-starter-parent,這樣做有什麼好處?

小小白:通過繼承的方式可以很方便的進行依賴版本管理,使用默認的依賴版本,當然也可以更改這些依賴的版本號。繼承spring-boot-starter-parent可以獲取以下默認特性:

  • 默認使用Java1.6進行編譯;

  • 默認代碼編碼爲UTF-8;

  • 新建項目的pom文件可以省略依賴庫的<version>標籤,例如添加activemq依賴的時候,可以不寫版本號;

  • 恰到好處的資源過濾;

  • 恰到好處的插件配置,如exec插件;

  • 恰到好處的對application.properties和application.yml進行篩選。

面試官:Spring Boot中如何實現對不同環境的屬性配置文件的支持?

小小白:Spring-Boot支持不同環境的屬性配置文件切換,通過創建application-{profile}.properties文件,其中{profile}是具體的環境標識名稱,例如:application-dev.properties用於開發環境,application-test.properties用於測試環境,application-uat.properties用於uat環境。如果要想使用application-dev.properties文件,則在application.properties文件中添加spring.profiles.active=dev;如果要想使用application-test.properties文件,則在application.properties文件中添加spring.profiles.active=test。

面試官:這樣會有一個問題,不可能每次打包部署都手動修改application.properties中spring.profiles.active的值,這個問題如何解決?

小小白:一般的做法是在項目路徑下建立以環境標識名稱爲名的目錄,然後每個目錄下添加各自環境的application.properties屬性配置,在自動打包部署的時候將對應的application.properties拷貝到classpath下,這樣就實現了配置文件切換。

面試官:Spring Boot會自動加載哪些路徑下的application.properties?

小小白:Spring Boot支持從以下位置加載application.properties文件:當前目錄下的/config子目錄、當前目錄、classpath下的/config包、classpath根路徑。

面試官:如果這四個路徑的application.properties文件中配置了某屬性,最終生效的是哪個文件裏的?

小小白:最終生效的是當前目錄下的/config子目錄下的application.properties中的配置,覆蓋順序是當前目錄下的/config子目錄覆蓋當前目錄,當前目錄覆蓋classpath下的/config包,classpath下的/config包覆蓋classpath根路徑。

面試官:@SpringBootApplication註解有什麼作用?

小小白:從@SpringBootApplication註解源碼可以看到它具有@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三個註解的作用。@SpringBootConfiguration註解用於標註Spring應用引導類,在應用啓動的時候這個引導類會被執行;@EnableAutoConfiguration註解用於根據依賴自動開啓一些配置;@ComponentScan註解用於配置哪些基礎包或類被自動掃描。

往期推薦

面試官:Spring框架內置了哪些可擴展接口,咱們一個一個聊

Spring聲明式事務處理的實現原理,來自面試官的窮追拷問

Spring MVC相關面試題就是無底洞,反正我是怕了

說實話,面試這麼問Spring框架的問題,我快扛不住了

沒使用加號拼接字符串,面試官竟然問我爲什麼

面試官一步一步的套路你,爲什麼SimpleDateFormat不是線程安全的

都說ThreadLocal被面試官問爛了,可爲什麼面試官還是喜歡繼續問

Java註解是如何玩轉的,面試官和我聊了半個小時

如何去除代碼中的多次if而引發的一連串面試問題

String引發的提問,我差點跪了

就寫了一行代碼,被問了這麼多問題

面試官:JVM對鎖進行了優化,都優化了啥?

synchronized連環問

支持原創,我點【在看 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章