自動配置本質(zhì)需要3個類
- 服務(wù)類(功能類)
這也是starter的本質(zhì)目標,提供服務(wù)歹啼,但是化簡配置。注意,一定是需要配置的服務(wù)才有必要設(shè)置starter啦吧,然后在yml里面配置。比如web服務(wù),redis服務(wù),mongo服務(wù)等仍源。如果是是java的Date類這種,它直接能提供日期服務(wù)舔涎,但是不需要配置笼踩,所以這類都不是化簡的目標。
如果存在配置亡嫌,那么服務(wù)類內(nèi)部就一定就需要配置字段嚎于,這些字段里寫入的就是配置信息。其實開發(fā)者也可以new出來一個服務(wù)對象(當(dāng)然可以使用spring進行注入挟冠,省去new)于购,然后手動設(shè)置這些配置內(nèi)容也可以,實際開發(fā)中也有使用知染,比如prodb中配置rabbitmq的時候肋僧。但是更多時候我們想要通過yml配置,同時如果是最常用的配置希望框架幫自己配好控淡。這是我們的期待嫌吠,也是springboot幫我們做的。
提供的的服務(wù)對象逸寓,不一定是一個居兆,可能是多個,比如kafka的自動配置竹伸,就能提供KafkaTemplate泥栖、ProducerFactory、ConsumerFactory等多個bean勋篓,每個bean都能提供一部分功能(服務(wù))吧享。這些個bean都是在執(zhí)行類中配置的。
- 配置類
類名一般都叫XXXProperties譬嚣。它的字段就是服務(wù)類的字段钢颂,一模一樣。然后它能夠和yml里面的配置項一一對應(yīng)起來拜银。配置項里的key就是字段名殊鞭。通過 @ConfigurationProperties注解綁定。
- 執(zhí)行類
類名一般都叫XXXAutoConfiguration尼桶。 執(zhí)行配置操作操灿,實例化一個服務(wù)對象,放入spring的容器泵督,然后把pojo中的字段賦值給它趾盐,同時對大部分有必要的字段(配置項)設(shè)定默認值。這樣我們就可以使用yml配置某項服務(wù),然后在沒有配置的時候也按照默認配置使用服務(wù)救鲤。
這個類上有 @ConditionalOnClass和@ConditionalOnProperty 注解久窟,說明服務(wù)文件和配置項都存在的時候就進行配置并實例化。換句話說就是當(dāng)你導(dǎo)入某個服務(wù)的jar包本缠,并且配置了它的內(nèi)容時候斥扛,你就能在代碼中使用了。如果@ConditionalOnProperty 注解的 matchIfMissing = true 進行了設(shè)置丹锹,那么就只需要導(dǎo)入jar包就能使用了犹赖。當(dāng)然,此時使用的配置是默認配置卷仑。你也可以修改成自己需要的配置。
能提供服務(wù)的類麸折,就是執(zhí)行類中函數(shù)返回的對象锡凝,被配置成了服務(wù)bean,函數(shù)內(nèi)部會使用配置類中的配置字段去set服務(wù)類內(nèi)部的字段垢啼。用戶會使用這些bean的時候直接注入即可窜锯。比如RedisTemplate。(也可能不直接用芭析,可能是被框架用锚扎,用戶感覺不到存在,但是也發(fā)揮作用了)
關(guān)于注解:
- 服務(wù)類
不需要加注解的馁启。在這個自動配置的體系里驾孔,它只需要提供功能,被執(zhí)行類配置就行惯疙。
- 配置類
@ConfigurationProperties(prefix = "hello")翠勉,用于說明在yml的配置文件中,本配置的前綴是什么霉颠。
- 執(zhí)行類
個數(shù)不定对碌,一般會有如下幾個:
@EnableConfigurationProperties(HttpEncodingProperties.class),括號中的對象就是配置內(nèi)容類 蒿偎。
@ConditionalOnClass(CharacterEncodingFilter.class)朽们,括號內(nèi)的類存在的時候進行配置。如果classpath下有這個服務(wù)類诉位,那么就進行配置骑脱。
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true),某個配置存在的時候才實例化這個關(guān)聯(lián)類不从。
最后的配置
最后要有一個spring.factories文件來配置有哪些內(nèi)容是自動注冊的惜姐;比如指定數(shù)據(jù)庫是自動注冊的,Date服務(wù)是不用管的
用starter pom,不光是引入了相關(guān)依賴的jar包歹袁,而且由于jar包的引入坷衍,引入了相關(guān)的類,觸發(fā)自動配置条舔。那么這些引入的內(nèi)容的配置都按照默認值配好了枫耳。
所有內(nèi)容的自動觸發(fā)設(shè)置在autoconfigure那個包里面,簡單的配置每個都有上面說的3個類孟抗。一些復(fù)雜的配置迁杨,可能有n個配置類,然后有m個執(zhí)行類凄硼,配置出x個功能類铅协。比如web的配置。