- 良好的工程设计的组件依赖关系一定是单向的,如果有循环的依赖关系,组件间的生命周期都是不明确的。在golang中直接就不允许有循环import,所以哪怕spring可以支持循环依赖,也最好不要循环
- springboot2之后已经默认禁止了同名bean,并可以通过spring.main.allow-bean-definition-overriding配置
@Slf4j
@SpringBootApplication
@PropertySource(value = {"classpath:conf.properties"}, encoding = "UTF-8")
public class StartUp {
public static void main(String[] args) {
long start = System.currentTimeMillis();
// 手动禁止循环依赖,高版本springboot默认已经禁止了同名bean并提供了配置项,但是没提供循环依赖的配置项
try (ConfigurableApplicationContext context = new SpringApplicationBuilder(StartUp.class)
.initializers((ApplicationContextInitializer<GenericApplicationContext>) applicationContext -> {
applicationContext.setAllowCircularReferences(false);
}).run(args)) {
// 先启动grpc再启动http探活
context.getBean(GrpcServer.class).start();
context.getBean(HttpServer.class).bind();
log.info("start success cost:{}", System.currentTimeMillis() - start);
} catch (Exception e) {
log.error("start error", e);
System.exit(-1);
}
}
}
网友评论