SpringBoot系列 自動配置原始碼分析

2021-09-14 07:25:30 字數 3093 閱讀 2405

@target(elementtype.type)

@retention(retentionpolicy.runtime)

@documented

@inherited

@springbootconfiguration

@enableautoconfiguration

@componentscan(excludefilters = )

@springbootconfiguration

由springboot定義,標註乙個springboot配置類,配置類相當於配置檔案,是容器中的乙個元件.

而@springbootconfiguration的註解@configuration是由spring定義.

@target(elementtype.type)

@retention(retentionpolicy.runtime)

@documented

@configuration

public @inte***ce springbootconfiguration {}

@enableautoconfiguration

開啟自動配置功能

被@autoconfigurationpackage(自動配置包)標註,

被@import(enableautoconfigurationimportselector.class)標註

@target(elementtype.type)

@retention(retentionpolicy.runtime)

@documented

@inherited

@autoconfigurationpackage

@import(enableautoconfigurationimportselector.class)

public @inte***ce enableautoconfiguration {}

enableautoconfigurationimportselector.class是決定匯入哪些元件的選擇器,父類autoconfigurationimportselector.class的public string selectimports(annotationmetadata annotationmetadata)方法將需要的元件以全類名的string的方式返回,新增到容器中,會給容器匯入很多自動配置類(***autoconfiguration,位於spring-boot-autoconfigure.jar),作用是匯入這個功能場景需要的所有元件並配置好,免去了手動編寫配置注入功能元件

@override

public string selectimports(annotationmetadata annotationmetadata)

try

catch (ioexception ex)

}

得到這個string的方法是getcandidateconfigurations(annotationmetadata, attributes),內部呼叫springfactoriesloader.loadfactorynames(getspringfactoriesloade***ctoryclass(), getbeanclassloader()),

第乙個引數getspringfactoriesloade***ctoryclass()即enableautoconfiguration.class.

protected listgetcandidateconfigurations(annotationmetadata metadata,

annotationattributes attributes)

loadfactorynames方法

public static listloadfactorynames(class<?> factoryclass, classloader classloader) 

return result;

}catch (ioexception ex)

}

通過類載入器的getresources方法(引數為"meta-inf/spring.factories")從類路徑下的meta-inf/spring.factories獲取enableautoconfiguration指定的值,這些值作為自動配置類匯入到容器中.

public static final string factories_resource_location = "meta-inf/spring.factories";
@autoconfigurationpackage又被@import(spring的底層註解,給容器中匯入乙個元件,由括起的autoconfigurationpackages.registrar.class來決定匯入的元件)標註.

@target(elementtype.type)

@retention(retentionpolicy.runtime)

@documented

@inherited

@import(autoconfigurationpackages.registrar.class)

public @inte***ce autoconfigurationpackage {}

@order(ordered.highest_precedence)

static class registrar implements importbeandefinitionregistrar, determinableimports

}

總結:

@springbootconfiguration將啟動類標註為乙個元件

@enableautoconfiguration開啟了自動配置功能

其中:2.1 @autoconfigurationpackage是掃瞄啟動類的包及其子包的元件,進行自動配置

2.2 @import(enableautoconfigurationimportselector.class)是按照功能場景的需求新增springboot自身的元件,進行自動配置

SpringBoot系列(四)資源檔案屬性配置

自定義資源檔案 1 首先在pom.xml中新增依賴,不新增的話讀取不到 org.springframework.boot spring boot configuration processor true 2 繫結資源檔案 configuration configurationproperties p...

基於springboot的多資料來源自動配置實現

最近做了乙個自動支援多資料來源配置的功能,基於springboot生態擴充套件,可自動識別配置檔案中的資料庫配置引數,並進行autoconfig。功能性 非功能性 注意事項 如何使用 1 要使用多資料來源自動配置,需要將springboot自帶的datasource相關自動配置類遮蔽自動啟動。在sp...

SpringBoot新增Swagger配置

swagger 是乙個規範和完整的框架,用於生成 描述 呼叫和視覺化 restful 風格的 web 服務。總體目標是使客戶端和檔案系統作為伺服器以同樣的速度來更新。檔案的方法 引數 模型緊密整合到伺服器端的 允許api來始終保持同步。swagger 讓部署管理和使用功能強大的api從未如此簡單。1...