亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Boot自動配置源碼實例解析

 更新時間:2024年08月17日 11:51:09   作者:從零開始的-CodeNinja之路  
Spring Boot作為Java領域最為流行的快速開發(fā)框架之一,其核心特性之一就是其強大的自動配置機制,下面這篇文章主要給大家介紹了關于Spring?Boot自動配置源碼的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

Spring-Boot-Starter

一、準備配置類和 Bean 對象

Spring Boot 提供了兩個注解:

  • @Configuration:Spring 提供的配置類注解,作用在類上,代表整個類是個 Spring 配置類,對照傳統(tǒng)的 Spring XML 配置文件
  • @Bean:作用于方法上,代表此方法的返回值(對象)將會被 Spring 容器所管理,從而完成 Bean 的自動注冊。

這兩個組合起來搭配可以完美的代替?zhèn)鹘y(tǒng)的 Spring XML 配置文件,并給 Spring Boot 的自動配置提供基本數(shù)據(jù)體。

二、自動配置條件依賴

有些情況下自動配置類并不是在任何條件下都能生效的,此時我們需要制定自動配置生效的條件,可以使用 Spring Boot 提供的注解來指定生效條件。

這些注解是 spring boot 特有的,常見的條件依賴注解有:

注解 功能說明

  • @ConditionalOnBean 僅在當前上下文中存在某個 bean 時,才會實例化這個 Bean
  • @ConditionalOnClass 某個 class 位于類路徑上,才會實例化這個 Bean
  • @ConditionalOnExpression 當表達式為 true 的時候,才會實例化這個 Bean
  • @ConditionalOnMissingBean 僅在當前上下文中不存在某個 bean 時,才會實例化這個 Bean
  • @ConditionalOnMissingClass 某個 class 在類路徑上不存在的時候,才會實例化這個 Bean
  • @ConditionalOnNotWebApplication 不是 web 應用時才會實例化這個 Bean
  • @AutoConfigureAfter 在某個 Bean 完成自動配置后實例化這個 Bean
  • @AutoConfigureBefore 在某個 Bean 完成自動配置前實例化這個 Bean

三、Bean 的參數(shù)獲取

舉個例子,例如在 Spring Boot Web 項目中,我們經(jīng)常會導入 MyBatis 相關的依賴,幫助我們與數(shù)據(jù)庫打交道,那么在傳統(tǒng)的 Spring 項目中,我們一般會在 Spring 容器配置 XML 文件中去使用 標簽生成相關數(shù)據(jù)源(DataSource),那么這個 DataSource 需要我們提供數(shù)據(jù)庫連接參數(shù):driver、url、username、password 這四個最基本的參數(shù),這些數(shù)據(jù)可能放在一個叫做 db.properties 文件中,這種文件我們稱為外部數(shù)據(jù)源文件,在 Spring 配置文件中聲明:<context:property-placeholder location=“classpath:db.properties”/>

這樣就可以引入文件中的配置參數(shù)了,從而賦值給 DataSource 這個 Bean 所需要的屬性參數(shù)。最后完成對象初始化。

這個過程在傳統(tǒng) Spring 開發(fā),無疑是略顯繁瑣,如果在某些我們需要自定義類和大量參數(shù)屬性從外部文件引入,這個時候 properties 文件格式也比較復雜,文件可能較多,在初始化 Bean 時,需要手寫大量的屬性賦值。

那么 Spring Boot 提供了注解幫助我們減小開發(fā)量,更加規(guī)范 Bean 參數(shù)的獲取方式。

默認情況下我們 Bean 的參數(shù)配置在 application.yml 文件中,使用 YAML 文件格式定義,比 properties 文件更有層級感,更簡約。

搭配 @EnableConfigurationProperties、@ConfigurationProperties 這兩個注解可以直接實現(xiàn)自動配置類的 Bean 參數(shù)獲取。

3.1 @EnableConfigurationProperties 注解

這個注解使用情況:自動配置類中需要從外部文件獲取參數(shù),來進行初始化。

在注解中指定一個類,這個時候可以配置類可以在這個類中獲取到外部文件的參數(shù),交給配置類中的 Bean 進行初始化。

3.2 @ConfigurationProperties 注解

注解使用情況:從外部文件獲取參數(shù)信息,加載到自身類屬性中,給 Spring 配置類提供外部數(shù)據(jù)來源,外部數(shù)據(jù)文件通常指的是 application.yml。

在注解中指定從 application.yml 文件獲取的前綴,例如 @ConfigurationProperties(prefix=“spring.datasource”),會獲取以這個字符串為前綴的所有參數(shù)進行自動匹配賦值。

所以可以看出兩個注解的關系是:

@EnableConfigurationProperties 注解作用在配置類中,并且使得該注解指定的數(shù)據(jù)文件類中的 @ConfigurationProperties 注解生效。

四. Bean 的發(fā)現(xiàn)

4.1 自己項目的 Bean 掃描

在寫 Spring Boot 項目時,一般在項目的代碼的根目錄會有一個 Spring Boot 啟動類:xxxApplication.java,這個類被 @SpringBootApplication 注解修飾標記成 Spring Boot 項目的啟動類。

@SpringBootApplication
public class SpringbootStarterApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootStarterApplication.class, args);
    }
}

此時再來看看如何完成 Bean 掃描,我們需要查看 @SpringBootApplication 注解源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    //...
}

我們重點查看 @SpringBootConfiguration 注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

可以看到這個注解被熟悉的 @Configuration 注解修飾。@SpringBootConfiguration 應用標注在某個類上說明這個類是SpringBoot 的主配置類,SpringBoot 需要運行這個類的 main 方法來啟動 SpringBoot 應用。

底層 Spring Boot 會幫我們將啟動類的當前路徑包以及子包的所有 Spring 組件(可能需要 @ComponentScan注解去做組件掃描)以及 Bean 掃描初始化。暫時只說淺層的流程,后續(xù)會深入 Spring 源碼學習。

4.2 jar 包的 Bean 掃描

那么前面聊了自己項目的 Bean 掃描,且 Spring Boot 默認掃描啟動類所在包下的主類與子類的所有組件,其中并沒有包括項目依賴包中的類,那么這些類是如何被 Spring Boot 發(fā)現(xiàn)的呢?

這就是第二個主要注解:@EnableAutoConfiguration,開啟自動配置:

這里引入其他博客的理解,覺得這幾句話簡單易懂:

@EnableAutoConfiguration 的作用
簡單點說就是 Spring Boot 根據(jù)依賴中的 jar 包,自動選擇實例化某些配置,配置類必須有 @Configuration 注解。

說白了,還是實例化對象,只是實例化的是依賴包中的類。

另外,我們也可以按照自動裝配的規(guī)范自己定義裝配的類。

接下來查看一下注解源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    //...
}

主要看 @Import({AutoConfigurationImportSelector.class}),這個注解導AutoConfigurationImportSelector.class 這個類(如果是其他版本,可能會是 @EnableAutoConfigurationImportSelector 這個是子類)。

我們找到 getCandidateConfigurations() 方法,這個方法就是用來加載依賴所需要的自動配置相關。

看到 SpringFactoriesLoader.loadFactoryNames() 的源碼:

其他版本可能是只有 loadFactoryNames() 方法,但是我們主要關注 classLoader.getResources() 方法中的常量:

很明顯這個方法是用來加載資源文件,而這個 Spring 工廠資源的路徑就是依賴中自動配置的相關路徑,根據(jù)這個路徑找到需要自動配置的類,最后完成依賴的自動配置。我們導入 mybatis-spring-boot-starter 依賴看看這個 META-INF/spring.factories 里邊是怎么樣的:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

簡單概括的流程:Spring Boot 會根據(jù) jar 包的 META-INF/spring.factories 文件的配置進行自動裝配,裝配的流程是 SpringFactoriesLoader.loadFactoryNames() 方法頂層實現(xiàn)的(底層實現(xiàn)需深入源碼),而開始外部自動裝配的注解是:@SpringBootApplication 注解中的 @Import({AutoConfigurationImportSelector.class})

主導整個過程。

五. Bean 的加載

在 Spring Boot 中將一個普通類交給 Spring 容器管理,通常有以下幾個方法:

使用 @Configuration 配合 @Bean 注解使用(配置類)。

使用 @Controller、@Service、@Repository、@Component 注解標注類并且使用 @ComponentScan 自動掃描(組件掃描)。

使用 @Import 方法(加載外部依賴的類)。

在上面可以看到 Spring Boot 實現(xiàn)自動配置使用的是 @Import 注解這種方式。

AutoConfigurationImportSelector 類的 selectImports() 方法(其中調(diào)用了 getAutoConfigurationEntry() 方法主要過程)返回一組從 META-INF/spring.factories 文件中讀取的 Bean 的全限定名,這樣 Spring Boot 就可以加載到這些 Bean 并完成實例的初始化工作。

自動配置總結(jié)

經(jīng)過前面的分析,將自動配置的關鍵步驟以及對應注解抽取出來:

定義需要自動裝配的類信息:@Configuration、@Bean,Spring Boot 配置類。

設置自動配置條件依賴:@Conditional。

將外部配置文件讀取并封裝成 Bean,讓配置類讀取參數(shù):@EnableConfigurationProperties、@ConfigurationProperties。

實現(xiàn) Bean 的發(fā)現(xiàn)與加載:@EnableAutoConfiguration、@Import。

總結(jié)

到此這篇關于Spring Boot自動配置源碼實例解析的文章就介紹到這了,更多相關SpringBoot自動配置源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java數(shù)組排序示例(冒泡排序、快速排序、希爾排序、選擇排序)

    java數(shù)組排序示例(冒泡排序、快速排序、希爾排序、選擇排序)

    java中在運用數(shù)組進行排序功能時,一般有四種方法:快速排序法、冒泡法、選擇排序法、插入排序法(希爾排序(Shell Sort)是插入排序的一種),下面是一些示例,需要的朋友可以參考下
    2014-03-03
  • 淺談java封裝

    淺談java封裝

    封裝封裝就是將屬性私有化,提供公有的方法訪問私有的屬性。*實現(xiàn)封裝的步驟:(1)修改屬性的可見性來限制對屬性的訪問。(2)為每個屬性創(chuàng)建一對賦值方法和取值方法,用于對這些屬性的訪問。(3)在賦值和取值方法中,加入對屬性的存取限制。
    2015-03-03
  • Java實現(xiàn)分頁的前臺頁面和后臺代碼

    Java實現(xiàn)分頁的前臺頁面和后臺代碼

    這篇文章主要為大家詳細介紹了Java實現(xiàn)分頁的前臺頁面和后臺代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 關于使用jpa聚合函數(shù)遇到的問題

    關于使用jpa聚合函數(shù)遇到的問題

    這篇文章主要介紹了關于使用jpa聚合函數(shù)遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • IntelliJ IDEA如何設置JDK版本

    IntelliJ IDEA如何設置JDK版本

    這篇文章主要介紹了IntelliJ IDEA如何設置JDK版本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java設置PDF跨頁表格重復顯示表頭行的步驟詳解

    Java設置PDF跨頁表格重復顯示表頭行的步驟詳解

    這篇文章主要給大家介紹了關于Java設置PDF跨頁表格重復顯示表頭行的相關資料,這里使用的是Free Spire.PDF for Java的jar包,Spire.PDF for Java 是一款專門對 PDF 文檔進行操作的 Java 類庫,需要的朋友可以參考下
    2021-07-07
  • Java如何獲取文件夾下所有壓縮包下指定文件

    Java如何獲取文件夾下所有壓縮包下指定文件

    在Java中,通過遍歷文件夾并對壓縮包進行解析,可以實現(xiàn)提取指定文件的功能,如文檔、PDF等,該過程中可增加過濾條件來適應不同需求,例如文件類型或文件名過濾,該方法適用于處理大量數(shù)據(jù)時的文件管理和數(shù)據(jù)提取
    2024-09-09
  • 深入解析SpringBoot自動配置原理

    深入解析SpringBoot自動配置原理

    這篇文章主要介紹了深入解析SpringBoot自動配置原理,SpringBoot?的一大好處就是:大大簡化了?Spring?和其他框架的整合配置,為了簡化配置文件使開發(fā)者更專注于業(yè)務編碼,可以使用?SpringBoot?來進行?Web?開發(fā),需要的朋友可以參考下
    2023-11-11
  • String.replaceAll方法詳析(正則妙用)

    String.replaceAll方法詳析(正則妙用)

    這篇文章主要給大家介紹了關于String.replaceAll方法,正則妙用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • Spring Cloud Alibaba Nacos Config加載配置詳解流程

    Spring Cloud Alibaba Nacos Config加載配置詳解流

    這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-07-07

最新評論