二、解讀run方法
大概聊聊springboot的自動配置,這裡是基於springboot 2.0.6.release,spring 5.0.10.release。
public
class
}
@target()
@retention
(retentionpolicy.runtime)
@documented
@inherited
@springbootconfiguration
// springboot特有的配置註解
@enableautoconfiguration
// 開啟自動配置(本質是根據依賴自動配置)
@componentscan
( excludefilters =),
@filter
(type = filtertype.custom,classes =)}
)public @inte***ce
)@retention
(retentionpolicy.runtime)
@documented
@configuration
public @inte***ce
springbootconfiguration
@target()
@retention
(retentionpolicy.runtime)
@documented
@inherited
@autoconfigurationpackage
// 自動配置包
@import()
public @inte***ce
enableautoconfiguration
; string[
]excludename()
default
;}
@autoconfigurationimportselector
import了autoconfigurationimportselector
類:
@override
public string[
]selectimports
(annotationmetadata annotationmetadata)
autoconfigurationmetadata autoconfigurationmetadata = autoconfigurationmetadataloader
.loadmetadata
(this
.beanclassloader)
; annotationattributes attributes =
getattributes
(annotationmetadata)
; list
configurations =
getcandidateconfigurations
(annotationmetadata,
attributes)
; configurations =
removeduplicates
(configurations)
; set
exclusions =
getexclusions
(annotationmetadata, attributes)
;checkexcludedclasses
(configurations, exclusions)
; configurations.
removeall
(exclusions)
; configurations =
filter
(configurations, autoconfigurationmetadata)
;fireautoconfigurationimportevents
(configurations, exclusions)
;return stringutils.
tostringarray
(configurations);}
↓ protected list
getcandidateconfigurations
(annotationmetadata metadata,
annotationattributes attributes)
重寫了selectimports()方法,其中呼叫了getcandidateconfigurations()方法,通過註解元資料和註解屬性獲得候選配置。loadfactorynames()
方法通過loadspringfactories()
載入meta-inf/spring.factories檔案。(下文2.1會具體解讀)其中就有enableautoconfiguration
,提供了許多自動配置類。
autoconfigure下有各種自動配置:
meta-inf/spring.factories
看到有許多自動裝配的bean
(key-value形式,key是類名或者介面名,而value是實現名)
而當這些配置滿足一定條件,就會自動配置。
@configuration
@conditionalonclass()
@enableconfigurationproperties()
@import()
public
class
datasourceautoconfiguration
, args);}
↓public
(class<
?>
primarysources,
string[
] args)
↓public
(resourceloader resourceloader, class<
?>..
. primarysources)
(
)for
(string classname : servlet_indicator_classes)}}
private
static
final string[
] servlet_indicator_classes =
;
private
collection
getspringfactoriesinstances
(class
type,
class<
?>
parametertypes, object.
.. args)
2.1、springfactoriesloader類的loadfactorynamespublic
static list
loadfactorynames
(class<
?> factoryclass,
@nullable classloader classloader)
↓private
static map
>
loadspringfactories
(@nullable classloader classloader)
try}
cache.
put(classloader, result)
;return result;
}catch
(ioexception ex)
}
類載入器到factories_resource_location
路徑下獲取檔案資源。
public
static
final string factories_resource_location =
"meta-inf/spring.factories"
;
可以看到,最後也是要讀取meta-inf下的spring.factories檔案。 Springboot學習筆記(一)
web應用 spring web mvc 應用 spring web flux 應用 元件自動裝配 web mvc,web flax,jdbc 嵌入式web容器 tomcat,jetty,undertow 生產準備特性 指標,健康檢查,外部化配置 元件自動裝配 啟用 enableautoconfig...
學習springboot筆記(一)
1.微服務 乙個專案可以由多個小型服務構成 微服務 springboot可以快速開發微服務塊。2.springboot功能 a 簡化j2ee開發 b 整個spring技術的棧的整合 整合springmvc spring c 整個j2ee技術的整合 整合mybatis struct2 redis 3....
SpringBoot學習筆記(一)
spring.profiles.active tomcat配置 修改伺服器端口號 server.port 8081 修改上下文路徑 server.servlet.context path example 配置 tomcat url 編碼 server.tomcat.uri encoding utf ...