SpringBoot原理
配置優先順序
配置檔案
-
SpringBoot 中支援三種格式的配置檔案:application.properties,application.yml,application.yaml。
-
其優先順序為:application.properties > application.yml > application.yaml。
注意事項
- 雖然springboot支援多種格式配置檔案,但是在專案開發時,推薦統一使用一種格式的配置 (yml是主流)。
其他配置方式
- SpringBoot 除了支援配置檔案屬性配置,還支援Java系統屬性和命令列引數方式進行屬性配置埠號:
- Java系統屬性:
-Dserver.port=埠號
;命令列引數:--server.port=埠號
。 - 優先順序為:命令列引數 > Java系統屬性。
在IDEA中配置
在命令列中配置
- 執行maven打包指令package生成jar包。
- 執行java指令,執行jar包,同時進行埠配置:
java -Dserver.port=埠號 -jar jar包名稱.jar --server.port=埠號
注意事項
- Springboot專案進行打包時,需要引入外掛 spring-boot-maven-plugin (基於官網骨架建立專案時,會自動新增該外掛)。
優先順序總結
- 命令列引數 > Java系統屬性 > application.properties > application.yml > application.yaml。
Bean管理
獲取Bean
-
預設情況下,Spring專案啟動時,會把bean都建立好放在IOC容器中,如果想要主動獲取這些bean,可以透過如下方式:
- 首先獲取IOC容器物件:
@Autowired private ApplicationContext applicationContect; //IOC容器物件
- 根據name獲取bean:
Object getBean(String name)
- 根據型別獲取bean:
<T> T getBean(Class<T> requiredType)
- 根據name獲取bean(帶型別轉換):
<T> T getBean(String name, Class<T> requiredType)
注意事項
- 上述所說的 【Spring專案啟動時,會把其中的bean都建立好】還會受到作用域及延遲初始化影響,這裡主要針對於預設的單例非延遲載入的bean而言。
bean作用域
- Spring支援五種作用域,後三種在web環境才生效:
作用域 | 說明 |
---|---|
singleton | 容器內同 名稱 的 bean 只有一個例項(單例)(預設) |
prototype | 每次使用該 bean 時會建立新的例項(非單例) |
request | 每個請求範圍內會建立新的例項(web環境中,瞭解) |
session | 每個會話範圍內會建立新的例項(web環境中,瞭解) |
application | 每個應用範圍內會建立新的例項(web環境中,瞭解) |
- 可以透過在Bean類上方使用 @Scope 註解來進行配置作用域:
@Scpoe("作用域名稱")
幾點注意
- 預設singleton的bean,在容器啟動時被建立,可以使用@Lazy註解來延遲初始化(延遲到第一次使用時)。
- prototype的bean,每一次使用該bean的時候都會建立一個新的例項。
- 實際開發當中,絕大部分的Bean是單例的,也就是說絕大部分Bean不需要配置scope屬性。
第三方bean
- 如果要管理的bean物件來自於第三方(不是自定義的),是無法用 @Component 及衍生註解宣告bean的,就需要用到 @Bean註解。
- 若要管理的第三方bean物件,建議對這些bean進行集中分類配置,可以透過 @Configuration 註解宣告一個配置類。
@Configuration
public class CommonConfig {
@Bean //將當前方法的返回值交給IOC容器管理,稱為IOC容器Bean
public SAXReader saxReader(){
return new SAXReader();
}
}
幾點注意
- 透過@Bean註解的name或value屬性可以宣告bean的名稱,如果不指定,預設bean的名稱就是方法名。
- 如果第三方bean需要依賴其它bean物件,直接在bean定義方法中設定形參即可,容器會根據型別自動裝配。
@Component及衍生註解與@Bean註解的選擇
- 專案中自定義的,使用@Component及其衍生註解。
- 專案中引入第三方的,使用@Bean註解。
SpringBoot原理
- Spring框架是世界上最流行的Java框架,它提供了很多優秀的子框架,而所有Spring家族中的框架都是基於Spring Framework這一基礎框架的。
- 但是Spring Framework使用起來非常繁瑣,體現在依賴和配置上。
- Spring Boot框架是用來簡化Spring框架的開發的,它開發起來更加簡單、快捷,也是Spring家族中最流行的一個子框架。
- Spring Boot框架提供了兩個非常重要的功能:起步依賴和自動配置,這些功能使它使用起來非常簡單、快捷。
起步依賴
- Spring Boot的起步依賴的功能是利用Maven的依賴傳遞特性實現的:它在起步依賴中提供了當前程式開發所需要的所有的常見依賴,並且做了版本的適配。
自動配置
- SpringBoot的自動配置就是當spring容器啟動後,一些配置類、bean物件就自動存入到了IOC容器中,不需要我們手動去宣告,從而簡化了開發,省去了繁瑣的配置操作。
自動配置原理
匯入第三方包的方法
方案一
- @ComponentScan元件掃描:在引導類上加上@ComponentScan註解,其屬性值為要匯入的包名字串陣列。
- 缺點:使用繁瑣,效能低。
方案二
-
@Import匯入:使用@Import匯入的類會被Spring載入到IOC容器中,匯入形式主要有以下幾種:
- 匯入普通類。
- 匯入配置類。
- 匯入ImportSelector介面實現類。
- 使用@EnableXxxx註解,封裝@Import註解。
-
其中第四種形式使用起來最為方便,也是Spring Boot採用的方式。
自動配置原理
- @SpringBootApplication註解該註解標識在SpringBoot工程引導類上,是SpringBoot中最最最重要的註解。該註解由三個部分組成:
組成部分 | 說明 |
---|---|
@SpringBootConfiguration | 該註解與 @Configuration 註解作用相同,用來宣告當前也是一個配置類 |
@ComponentScan | 元件掃描,預設掃描當前引導類所在包及其子包 |
@EnableAutoConfiguration | SpringBoot實現自動化配置的核心註解 |
- 在EnableAutoConfiguration註解上新增了@Import註解,其屬性值為AutoConfigurationImportSelector.class。
- 在AutoConfigurationImportSelector類中定義了幾個方法,其作用為從被引入的依賴的包的META-INF/spring/org.springframework.boot.AutoConfiguration.imports和META-INF/spring/spring.factories這兩個檔案中引入配置資訊。
- 這兩個檔案中儲存的即是要配置的自動配置類的全類名。
- 最後SpringBoot會根據這些檔案並按照@Conditional註解條件裝配Bean。
注意事項
- spring.factories檔案是Spring Boot早期版本中使用的,SpringBoot2.7.x引入了org.springframework.boot.AutoConfiguration.imports檔案併相容spring.factories檔案,Spring3.x版本中已經移除spring.factories檔案。
@Conditional
-
作用:按照一定的條件進行判斷,在滿足給定條件後才會註冊對應的bean物件到Spring IOC容器中。
-
位置:方法、類。
-
@Conditional 本身是一個父註解,派生出了大量的子註解:
- @ConditionalOnClass:判斷環境中是否有對應位元組碼檔案,有才註冊bean到IOC容器。屬性為name,其值為要判斷的類的全類名。
@Bean @ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //當前環境存在指定的這個類時,才宣告該bean public HeaderParser headerParser(){...}
- @ConditionalOnMissingBean:判斷環境中沒有對應的bean(根據型別或名稱判斷) ,沒有才註冊bean到IOC容器。屬性為value,其值為要判斷的類的全類名;name,其值為要判斷的bean物件的物件名。預設為當前被註解的bean。
@Bean @ConditionalOnMissingBean //當不存在當前型別的bean時,才宣告該bean public HeaderParser headerParser(){...}
- @ConditionalOnProperty:判斷配置檔案中有對應屬性和值,有才註冊bean到IOC容器。屬性為name,其值為要判斷的配置檔案中的屬性;havingValue,其值為要判斷的配置檔案中的屬性對應的值
@Bean @ConditionalOnProperty(name = "name",havingValue = "zgg1h") //配置檔案中存在對應的屬性和值,才註冊bean到IOC容器 public HeaderParser headerParser(){...}
自定義starter
- 在實際開發中,經常會定義一些公共元件,提供給各個專案團隊使用。而在SpringBoot的專案中,一般會將這些公共元件封裝為SpringBoot的starter。
- 一般在xxxx-spring-boot-starter模組中實現依賴管理功能,在xxxx-spring-boot-autoconfigure模組實現自動配置功能,並將autoconfigure模組引入到starter模組中。
步驟
- 建立xxxx-spring-boot-starter模組
- 建立xxxx-spring-boot-autoconfigure模組,在starter中引入該模組。
- 在xxxx-spring-boot-autoconfigure模組中的定義自動配置功能,並定義自動配置檔案META-INF/spring/xxxx.imports。
Web後端開發總結
- Web後端開發使用到的技術及其歸屬框架如下:
- 其中SpringMVC、Spring Framework和Mybatis被統稱為SSM。
- SpringMVC框架即為Spring Framework中的web開發模組。