springboot核心原理

大雄45發表於2021-04-30
導讀 Spring Boot是伴隨著Spring4.0共同誕生的,它的目的就是簡化spring的配置及開發,並協助開發人員可以整體管理應用程式的配置而不再像以前那樣需要做大量的配置工作,它提供了很多開發元件,並且內嵌了web應用容器,如tomcat和Jetty等。其目的便是使我們的開發變得簡化並且能大幅度提高開發人員的開發效率,為了簡化Spring功能的配置我們可以引入或啟動我們需要的Spring功能。這樣做的好處就是避免開發人員過多的對框架的關注,而把更多的精力與時間放在系統的業務邏輯程式碼中。
1.基於你對springboot的理解描述一下什麼是springboot

它是一個服務於spring框架的框架,能夠簡化配置檔案,快速構建web應用,
內建tomcat,無需打包部署,直接執行。

2.約定優於配置指的是什麼?

maven 的目錄結構
a) 預設有 resources 資料夾存放配置檔案
b) 預設打包方式為 jar
spring-boot-starter-web 中預設包含 spring mvc 相關依賴以及內建的 tomcat 容器,使得構建一個 web 應用更加簡單
預設提供 application.properties/yml 檔案
預設透過 spring.profiles.active 屬性來決定執行環境時讀取的配置檔案
EnableAutoConfiguration 預設對於依賴的 starter 進行自動

3.@SpringBootApplication由哪幾個註解組成,這幾個註解分別表示什麼作用

SpringBootApplication 本質上是由 3 個註解組成,分別是

@Configuration
@EnableAutoConfiguration
@ComponentScan
@Configuration:
在啟動類裡面標註了@Configuration,意味著它其實也是一個 IoC
容器的配置類

@EnableAutoConfiguration:
springboot 應用把所有符合條件的@Configuration 配置
都載入到當前 SpringBoot 建立並使用的 IoC 容器中。

@ComponentScan:
ComponentScan 預設會掃描當前 package 下的的所有加
了@Component 、@Repository、@Service、@Controller的類到 IoC 容器中;

4.springboot自動裝配的實現原理

springboot核心原理springboot核心原理

如果是之前的spring中使用redis需要在xml定義bean,現在只需要依賴一個spring-boot-starter-data-redis
的jar包,jar中定義了RedisConfiguration,當啟動的時候spring會自動裝載RedisConfiguration,那spring是如何知道配置類在哪裡的呢?RedisConfiguration類的路徑放在了classpath*META-INF/spring.factories的檔案中,spring會載入這個檔案中配置的configuration

(1)SpringApplication.run(AppConfig.class,args);執行流程中有refreshContext(context);這句話.
(2)refreshContext(context);內部會解析我們的配置類上的標籤.實現自動裝配功能的註解@EnableAutoConfiguration
(3)會解析@EnableAutoConfiguration這個註解裡面的@Import引入的配置類.AutoConfigurationImportSelector
(4)AutoConfigurationImportSelector這個類中有這個方
法.SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
(5)SpringFactoriesLoader.loadFactoryNames的作用就是讀取jar包中的/專案中的META-INF/spring.factories檔案.
(6)spring.factories配置了要自動裝配的Configuration類

5.spring中的spi機制的原理是什麼?

SPI的全名為Service Provider Interface,為某個介面尋找 服 務實現的機制。
當服務的提供者,提供了服務介面的一種實現之後,在jar包的META-INF/services/目錄裡同時建立一個以服務介面命名的檔案。該檔案裡就是實現該服務介面的具體實現類。而當外部程式裝配這個模組的時候,就能透過該jar包META-INF/services/裡的配置檔案找到具體的實現類名,並裝載例項化,完成模組的注入。透過這個約定,就不需要把服務放在程式碼中了,透過模組被裝配的時候就可以發現服務類了。

在springboot的自動裝配過程中,最終會載入META-INF/spring.factories檔案,而載入的過程是由SpringFactoriesLoader載入的。從CLASSPATH下的每個Jar包中搜尋所有META-INF/spring.factories配置檔案,然後將解析properties檔案,找到指定名稱的配置後返回。需要注意的是,其實這裡不僅僅是會去ClassPath路徑下查詢,會掃描所有路徑下的Jar包,只不過這個檔案只會在Classpath下的jar包中。

透過spi技術可以自定義starter,在自定義的配置檔案META-INF/spring.factories中加入實現類,依賴這個starter的專案就會掃描jar包下的配置,找到實現類進行裝載例項化


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2770638/,如需轉載,請註明出處,否則將追究法律責任。

相關文章