SpringBoot原理篇

目錄
配置優(yōu)先級(jí)
Bean管理
SpringBoot原理

一、配置優(yōu)先級(jí)
配置
SpringBoot 中支持三種格式的配置文件:

注意事項(xiàng):
雖然springboot支持多種格式配置文件,但是在項(xiàng)目開發(fā)時(shí),推薦統(tǒng)一使用一種格式的配置 (yml是主流)。

SpringBoot 除了支持配置文件屬性配置,還支持Java系統(tǒng)屬性和命令行參數(shù)的方式進(jìn)行屬性配置。
Java系統(tǒng)屬性:-Dserver.port=9000
命令行參數(shù):--server.port=10010

①. 執(zhí)行maven打包指令package

②. 執(zhí)行java指令,運(yùn)行jar包
java -Dserver.port=9000 -jar tlias-web-management-0.0.1-SNAPSHOT.jar --server.port=10010
注意事項(xiàng):
Springboot項(xiàng)目進(jìn)行打包時(shí),需要引入插件 spring-boot-maven-plugin (基于官網(wǎng)骨架創(chuàng)建項(xiàng)目,會(huì)自動(dòng)添加該插件)

優(yōu)先級(jí)(高到底)
命令行參數(shù)(--xxx=xxx)
java系統(tǒng)屬性(-Dxxx=xxx)
application.properties
application.yml
application.yaml(忽略)

二、Bean管理
1.獲取bean
默認(rèn)情況下,Spring項(xiàng)目啟動(dòng)時(shí),會(huì)把bean都創(chuàng)建好放在IOC容器中,如果想要主動(dòng)獲取這些bean,可以通過如下方式:
根據(jù)name獲取bean:
Object getBean(String name)
根據(jù)類型獲取bean:
<T> T getBean(Class<T> requiredType)
根據(jù)name的名稱及類型獲取bean:
<T> T getBean(String name, Class<T> requiredType)
注意事項(xiàng):
上述所說的 【Spring項(xiàng)目啟動(dòng)時(shí),會(huì)把其中的bean都創(chuàng)建好】還會(huì)受到作用域及延遲初始化影響,這里主要針對(duì)于 默認(rèn)的單例非延遲加載的bean而言。

2.bean作用域
Spring支持五種作用域,后三種在web環(huán)境才生效:

可以通過 @Scope 注解來進(jìn)行配置作用域:
注意事項(xiàng):
默認(rèn)singleton的bean,在容器啟動(dòng)時(shí)被創(chuàng)建,可以使用@Lazy注解來延遲初始化(延遲到第一次使用時(shí))。
prototype的bean,每一次使用該bean的時(shí)候都會(huì)創(chuàng)建一個(gè)新的實(shí)例。
實(shí)際開發(fā)當(dāng)中,絕大部分的Bean是單例的,也就是說絕大部分Bean不需要配置scope屬性。

3.第三方bean
@Bean
如果要管理的bean對(duì)象來自于第三方(不是自定義的),是無法用 @Component 及衍生注解聲明bean的,就需要用到 @Bean注解。
若要管理的第三方bean對(duì)象,建議對(duì)這些bean進(jìn)行集中分類配置,可以通過@Configuration注解聲明一個(gè)配置類。

新建一個(gè)config包,創(chuàng)建一個(gè)配置類(推薦)
測(cè)試:
注意事項(xiàng):
通過@Bean注解的name或value屬性可以聲明bean的名稱,如果不指定,默認(rèn)bean的名稱就是方法名。
如果第三方bean需要依賴其它bean對(duì)象,直接在bean定義方法中設(shè)置形參即可,容器會(huì)根據(jù)類型自動(dòng)裝配。
思考:
@Component 及衍生注解 與 @Bean注解使用場(chǎng)景?
項(xiàng)目中自定義的,使用@Component及其衍生注解
項(xiàng)目中引入第三方的,使用@Bean注解

SpringBoot原理



1.起步依賴原理
spring框架進(jìn)行web程序開發(fā),我們要引入各種依賴,還要兼顧版本號(hào)(繁瑣)

springboot框架進(jìn)行web程序開發(fā)


2.自動(dòng)配置
SpringBoot的自動(dòng)配置就是當(dāng)spring容器啟動(dòng)后,一些配置類、bean對(duì)象就自動(dòng)存入到了IOC容器中,不需要我們手動(dòng)去聲明,從而簡(jiǎn)化了開發(fā),省去了繁瑣的配置操作。
自動(dòng)配置原理(面試高頻):
方案一:@ComponentScan 組件掃描

方案二:@Import 導(dǎo)入。使用@Import導(dǎo)入的類會(huì)被Spring加載到IOC容器中,導(dǎo)入形式主要有以下幾種:
導(dǎo)入 普通類,交給IOC容器管理
導(dǎo)入 配置類,交給IOC容器管理
導(dǎo)入 ImportSelector 接口實(shí)現(xiàn)類
@EnableXxxx注解,封裝@Import注解(優(yōu)雅、方便)


源碼跟蹤

@SpringBootApplication是源碼的入口,這個(gè)注解底層封裝了三個(gè)注解

?該注解標(biāo)識(shí)在SpringBoot工程引導(dǎo)類上,是SpringBoot中最最最重要的注解。該注解由三個(gè)部分組成:
?@SpringBootConfiguration:該注解與 @Configuration 注解作用相同,用來聲明當(dāng)前也是一個(gè)配置類。
?@ComponentScan:組件掃描,默認(rèn)掃描當(dāng)前引導(dǎo)類所在包及其子包。
?@EnableAutoConfiguration:SpringBoot實(shí)現(xiàn)自動(dòng)化配置的核心注解。

在@EnableAutoConfiguration中又封裝了@Import注解

這個(gè)@Import注解當(dāng)中指定的是一個(gè)AutoConfigurationImportSelector這個(gè)接口的實(shí)現(xiàn)類,這個(gè)接口實(shí)現(xiàn)了selectImports這個(gè)方法

在這個(gè)方法AutoConfigurationImportSelector當(dāng)中加載了兩個(gè)文件。我們現(xiàn)在使用的版本是2.7.x版本,它還兼容spring.factories文件,到了springboot3.x.x當(dāng)中,spring.factories文件就會(huì)徹底移除掉。

org.springframework.boot.autoconfigure.AutoConfiguration.imports:

org.springframework.boot.autoconfigure.AutoConfiguration.imports這份文件當(dāng)中,定義的就是配置類的全類名,在這個(gè)配置類當(dāng)中,我們就可以通過@bean注解聲明一個(gè)一個(gè)的bean對(duì)象,最終SpringBoot項(xiàng)目在啟動(dòng)的時(shí)候,它就會(huì)加載這個(gè)配置文件當(dāng)中所配置的配置類,然后將這些配置類當(dāng)中的信息封裝到string類型的數(shù)組當(dāng)中,最終通過@Import這個(gè)注解將這些配置類全部加載到Spring的IOC容器當(dāng)中,交給IOC容器管理。
全部注冊(cè)為IOC容器的bean ?
SpringBoot會(huì)根據(jù)@Conditional注解條件裝配

@Conditional
作用:按照一定的條件進(jìn)行判斷,在滿足給定條件后才會(huì)注冊(cè)對(duì)應(yīng)的bean對(duì)象到Spring IOC容器中。
位置:方法、類
@Conditional 本身是一個(gè)父注解,派生出大量的子注解:
?@ConditionalOnClass:判斷環(huán)境中是否有對(duì)應(yīng)字節(jié)碼文件,才注冊(cè)bean到IOC容器。
?@ConditionalOnMissingBean:判斷環(huán)境中沒有對(duì)應(yīng)的bean(類型 或 名稱) ,才注冊(cè)bean到IOC容器。
?@ConditionalOnProperty:判斷配置文件中有對(duì)應(yīng)屬性和值,才注冊(cè)bean到IOC容器。

案例(自定義starter)
在實(shí)際開發(fā)中,經(jīng)常會(huì)定義一些公共組件,提供給各個(gè)項(xiàng)目團(tuán)隊(duì)使用。而在SpringBoot的項(xiàng)目中,一般會(huì)將這些公共組件封裝為SpringBoot 的 starter。


需求:自定義aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具類 AliyunOSSUtils 的自動(dòng)配置。
目標(biāo):引入起步依賴引入之后,要想使用阿里云OSS,注入 AliyunOSSUtils直接使用即可。
步驟:
創(chuàng)建 aliyun-oss-spring-boot-starter 模塊
創(chuàng)建aliyun-oss-spring-boot-autoconfigure模塊,在starter中引入該模塊
在aliyun-oss-spring-boot-autoconfigure模塊中的定義自動(dòng)配置功能,并定義自動(dòng)配置文件 META-INF/spring/xxxx.imports
