spring boot啟動(dòng)加載外部配置文件 springboot配置文件加載不全?
注意不要把springboot的配置搞錯(cuò)了,不管有沒(méi)有這個(gè)包,都可以 沒(méi)有它就不會(huì)有負(fù)擔(dān)。在Spring boot架構(gòu)中,每個(gè)源程序還需要添加一個(gè)import語(yǔ)句來(lái)引入其他需要包含的包。如果你把它放在
注意不要把springboot的配置搞錯(cuò)了,不管有沒(méi)有這個(gè)包,都可以 沒(méi)有它就不會(huì)有負(fù)擔(dān)。
在Spring boot架構(gòu)中,每個(gè)源程序還需要添加一個(gè)import語(yǔ)句來(lái)引入其他需要包含的包。
如果你把它放在一個(gè)分類(lèi)項(xiàng)目中,它可以 不能被識(shí)別。只有放在資源項(xiàng)中才能識(shí)別。
該錯(cuò)誤消息意味著沒(méi)有活動(dòng)的概要文件,所以只需打開(kāi)配置并選擇配置。
Springboot核心注釋@EnableAutoConfiguration會(huì)導(dǎo)入@Import(),它實(shí)現(xiàn)了DeferredImportSelector接口,即可以在spring完成beans初始化后回調(diào)接口的selectImports方法。該方法的參數(shù)是每個(gè)bean的類(lèi)屬性和注釋?zhuān)祷氐腷ean將被導(dǎo)入spring。自動(dòng)配置importselector實(shí)現(xiàn)邏輯如下:
這個(gè)方法的邏輯大致是在每個(gè)jar包下加載spring.factories配置文件,讀出自動(dòng)配置的類(lèi),然后去掉重復(fù)的和需要排除的,然后過(guò)濾,也就是filter方法。該方法如下:
關(guān)注第一個(gè)for循環(huán),getAutoConfigurationImportFilter()將返回Autoconfiguration ImportFilters的所有實(shí)現(xiàn)類(lèi)。目前只有OnClass實(shí)現(xiàn)了這個(gè)接口,即返回OnClass的所有對(duì)象。OnClassCondition繼承springBootCondition,match會(huì)根據(jù)條件過(guò)濾掉不合格的配置類(lèi),留下合格的配置類(lèi),由auto configuration import selector注入Spring完成加載。在這里,讓我們 讓我們討論一下match方法如何處理ConditionOnClass的注釋?zhuān)⒖纯磳?shí)現(xiàn)。其中實(shí)現(xiàn)了getOutcomes方法,其中使用createOutcomesResolver方法創(chuàng)建了兩個(gè)OutcomesResolver。應(yīng)該注意的是,一半的解析任務(wù)被留在一個(gè)新的線程中,以獲得更好的性能。在這里,我們主要看一下StandardOutcomesResolver的實(shí)現(xiàn)以及相應(yīng)的實(shí)現(xiàn)方法:
你可以看到閱讀上面的類(lèi)ConditionalOnClass批注的值,然后將其與環(huán)境進(jìn)行匹配。如果存在,則返回ConditionOutcome對(duì)象,如果存在,則返回null。經(jīng)過(guò)這些過(guò)濾,最終由上述的auto configuration import selector類(lèi)返回,并由spring加載,從而實(shí)現(xiàn)條件注釋的配置功能。
另外,@configuration類(lèi)將在ConfigurationClassPostProcessor中處理,一些其他類(lèi)型的@Condition條件判斷,比如OnJavaCondition注釋?zhuān)瑢⒃谶@里處理,所以我贏了 這里不再贅述。