最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot自動(dòng)配置源碼實(shí)例解析

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

Spring-Boot-Starter

一、準(zhǔn)備配置類和 Bean 對(duì)象

Spring Boot 提供了兩個(gè)注解:

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

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

二、自動(dòng)配置條件依賴

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

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

注解 功能說明

  • @ConditionalOnBean 僅在當(dāng)前上下文中存在某個(gè) bean 時(shí),才會(huì)實(shí)例化這個(gè) Bean
  • @ConditionalOnClass 某個(gè) class 位于類路徑上,才會(huì)實(shí)例化這個(gè) Bean
  • @ConditionalOnExpression 當(dāng)表達(dá)式為 true 的時(shí)候,才會(huì)實(shí)例化這個(gè) Bean
  • @ConditionalOnMissingBean 僅在當(dāng)前上下文中不存在某個(gè) bean 時(shí),才會(huì)實(shí)例化這個(gè) Bean
  • @ConditionalOnMissingClass 某個(gè) class 在類路徑上不存在的時(shí)候,才會(huì)實(shí)例化這個(gè) Bean
  • @ConditionalOnNotWebApplication 不是 web 應(yīng)用時(shí)才會(huì)實(shí)例化這個(gè) Bean
  • @AutoConfigureAfter 在某個(gè) Bean 完成自動(dòng)配置后實(shí)例化這個(gè) Bean
  • @AutoConfigureBefore 在某個(gè) Bean 完成自動(dòng)配置前實(shí)例化這個(gè) Bean

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

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

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

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

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

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

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

3.1 @EnableConfigurationProperties 注解

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

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

3.2 @ConfigurationProperties 注解

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

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

所以可以看出兩個(gè)注解的關(guān)系是:

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

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

4.1 自己項(xiàng)目的 Bean 掃描

在寫 Spring Boot 項(xiàng)目時(shí),一般在項(xiàng)目的代碼的根目錄會(huì)有一個(gè) Spring Boot 啟動(dòng)類:xxxApplication.java,這個(gè)類被 @SpringBootApplication 注解修飾標(biāo)記成 Spring Boot 項(xiàng)目的啟動(dòng)類。

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

此時(shí)再來看看如何完成 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 {
    //...
}

我們重點(diǎn)查看 @SpringBootConfiguration 注解:

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

可以看到這個(gè)注解被熟悉的 @Configuration 注解修飾。@SpringBootConfiguration 應(yīng)用標(biāo)注在某個(gè)類上說明這個(gè)類是SpringBoot 的主配置類,SpringBoot 需要運(yùn)行這個(gè)類的 main 方法來啟動(dòng) SpringBoot 應(yīng)用。

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

4.2 jar 包的 Bean 掃描

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

這就是第二個(gè)主要注解:@EnableAutoConfiguration,開啟自動(dòng)配置:

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

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

說白了,還是實(shí)例化對(duì)象,只是實(shí)例化的是依賴包中的類。

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

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

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

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

我們找到 getCandidateConfigurations() 方法,這個(gè)方法就是用來加載依賴所需要的自動(dòng)配置相關(guān)。

看到 SpringFactoriesLoader.loadFactoryNames() 的源碼:

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

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

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

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

主導(dǎo)整個(gè)過程。

五. Bean 的加載

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

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

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

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

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

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

自動(dòng)配置總結(jié)

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

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

設(shè)置自動(dòng)配置條件依賴:@Conditional。

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

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

總結(jié)

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

相關(guān)文章

  • java?Map.Entry的使用示例

    java?Map.Entry的使用示例

    Map.Entry是Java中Map接口的嵌套接口,它提供了獲取鍵和值的方法及遍歷和操作Map的鍵值對(duì),本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-11-11
  • Java的Struts框架中登陸功能的實(shí)現(xiàn)和表單處理器的使用

    Java的Struts框架中登陸功能的實(shí)現(xiàn)和表單處理器的使用

    這篇文章主要介紹了Java的Struts框架中登陸功能的實(shí)現(xiàn)和表單處理器的使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • SpringBoot整合easy-es的詳細(xì)過程

    SpringBoot整合easy-es的詳細(xì)過程

    本文介紹了EasyES,一個(gè)基于Elasticsearch的ORM框架,旨在簡(jiǎn)化開發(fā)流程并提高效率,EasyES支持SpringBoot框架,并提供了CRUD操作、批量操作和查詢操作等方法,文章還列舉了使用EasyES時(shí)可能遇到的技術(shù)難題及解決方法,感興趣的朋友一起看看吧
    2025-02-02
  • Spring Boot入門(web+freemarker)

    Spring Boot入門(web+freemarker)

    這篇文章主要介紹了Spring Boot入門(web+freemarker)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • JAVA生成pdf文件的實(shí)操教程

    JAVA生成pdf文件的實(shí)操教程

    PDF是可移植文檔格式,是一種電子文件格式,具有許多其他電子文檔格式無法相比的優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于JAVA生成pdf文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • java如何實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫設(shè)計(jì)文檔

    java如何實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫設(shè)計(jì)文檔

    以前我們還需要手寫數(shù)據(jù)庫設(shè)計(jì)文檔、現(xiàn)在可以通過引入screw核心包來實(shí)現(xiàn)Java?數(shù)據(jù)庫文檔一鍵生成。本文將具體介紹一下如何通過java自動(dòng)生成數(shù)據(jù)庫設(shè)計(jì)文檔,需要的朋友可以參考下
    2021-11-11
  • Java設(shè)計(jì)模式之抽象工廠模式詳解

    Java設(shè)計(jì)模式之抽象工廠模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之抽象工廠模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java中Collection集合常用API之?Collection存儲(chǔ)自定義類型對(duì)象的示例代碼

    Java中Collection集合常用API之?Collection存儲(chǔ)自定義類型對(duì)象的示例代碼

    Collection是單列集合的祖宗接口,因此它的功能是全部單列集合都可以繼承使用的,這篇文章主要介紹了Java中Collection集合常用API?-?Collection存儲(chǔ)自定義類型對(duì)象,需要的朋友可以參考下
    2022-12-12
  • logback和log4j日志框架堆棧信息添加TraceId方式

    logback和log4j日志框架堆棧信息添加TraceId方式

    這篇文章主要介紹了logback和log4j日志框架堆棧信息添加TraceId方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • ReentrantLock從源碼解析Java多線程同步學(xué)習(xí)

    ReentrantLock從源碼解析Java多線程同步學(xué)習(xí)

    這篇文章主要為大家介紹了ReentrantLock從源碼解析Java多線程同步學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

资中县| 宁波市| 霍山县| 门头沟区| 灵宝市| 台北市| 南开区| 张家口市| 大同市| 扶余县| 盖州市| 肇庆市| 洛浦县| 双桥区| 邛崃市| 孟州市| 洛宁县| 宁德市| 吴江市| 阳高县| 汕头市| 汝州市| 嘉义市| 茌平县| 宁安市| 财经| 兰州市| 开平市| 田东县| 丹东市| 沾益县| 嘉禾县| 故城县| 美姑县| 双辽市| 日喀则市| 突泉县| 搜索| 高邮市| 平安县| 贵德县|