起因:
最近遇到一個(gè)奇怪的事情只厘,工程手工打包沒(méi)有問(wèn)題乘综,通過(guò)jenkins打包啟動(dòng)就有問(wèn)題。
工程背景:最近接入apollo配置中心趴捅。
驗(yàn)證方式:去掉配置中心垫毙,使用application.yaml以及對(duì)應(yīng)的dev等的配置文件,手工打包和jenkins打包都是沒(méi)有問(wèn)題拱绑。
解決方案:對(duì)于apollo配置的類(@Configuration注解)明確寫(xiě)出bean的名字(比如:apolloRedisConfig)综芥,
? ? ? ? ? ? ? ? ? ?對(duì)于使用配置的類(RedisClient,使用@Component注解)添加@DependsOn(value = "apolloRedisConfig")
如此猎拨,就強(qiáng)制指定了依賴關(guān)系膀藐,就不會(huì)出現(xiàn)先加載REdisClient類,獲取不到配置信息红省,拋出異常额各,啟動(dòng)失敗。
思考:
A.我對(duì)項(xiàng)目啟動(dòng)做了debug吧恃,所有的注解定義的類(我自己定義的類)的啟動(dòng)順序如下:
????1.@SpringBootApplication虾啦,這個(gè)也是項(xiàng)目的啟動(dòng)類;
????2.@Configuration, @RestControllerAdvice , 這兩個(gè)沒(méi)有明顯的先后順序痕寓,間雜出現(xiàn)傲醉;
????????同時(shí),定義的SpringContextUtils implements ApplicationContextAware也出現(xiàn)在中間呻率,
????????看起來(lái)也沒(méi)有明顯的順序需频,PS:這個(gè)添加類@Component注解;
????3.@Controller, @RestController
????4.@Component, @Service等是沒(méi)有明顯順序筷凤,看起來(lái)是按照文件夾的命名排序順序加載的;
B.SpringFactoriesLoader.java
? ? 來(lái)自于:spring-core.jar
? ? package org.springframework.core.io.support;
????項(xiàng)目啟動(dòng)的時(shí)候苞七,會(huì)在SpringApplication.java的方法:getSpringFactoriesInstances中使用到SpringFactoriesLoader.java
????SpringFactoriesLoader.java會(huì)從META-INF/apring.factories中獲取需要加載的類
? ? 請(qǐng)參考:spring-boot/2.1.8.RELEASE 的spring.factories