JavaWeb學習筆記——第十四天

zgg1h發表於2024-04-04

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中配置

IDEA中配置埠號

在命令列中配置

  1. 執行maven打包指令package生成jar包。
  2. 執行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開發模組。

相關文章