起因:
最近遇到一个奇怪的事情,工程手工打包没有问题,通过jenkins打包启动就有问题。
工程背景:最近接入apollo配置中心。
验证方式:去掉配置中心,使用application.yaml以及对应的dev等的配置文件,手工打包和jenkins打包都是没有问题。
解决方案:对于apollo配置的类(@Configuration注解)明确写出bean的名字(比如:apolloRedisConfig),
对于使用配置的类(RedisClient,使用@Component注解)添加@DependsOn(value = "apolloRedisConfig")
如此,就强制指定了依赖关系,就不会出现先加载REdisClient类,获取不到配置信息,抛出异常,启动失败。
思考:
A.我对项目启动做了debug,所有的注解定义的类(我自己定义的类)的启动顺序如下:
1.@SpringBootApplication,这个也是项目的启动类;
2.@Configuration, @RestControllerAdvice , 这两个没有明显的先后顺序,间杂出现;
同时,定义的SpringContextUtils implements ApplicationContextAware也出现在中间,
看起来也没有明显的顺序,PS:这个添加类@Component注解;
3.@Controller, @RestController
4.@Component, @Service等是没有明显顺序,看起来是按照文件夹的命名排序顺序加载的;
B.SpringFactoriesLoader.java
来自于:spring-core.jar
package org.springframework.core.io.support;
项目启动的时候,会在SpringApplication.java的方法:getSpringFactoriesInstances中使用到SpringFactoriesLoader.java
SpringFactoriesLoader.java会从META-INF/apring.factories中获取需要加载的类