Spring Boot ConditionalOnBean 注解

r.r*_*r.r 2 java spring spring-boot

有spring boot 2.0.2配置

@Configuration
public class ApiConfig {

    @Bean
    @Profile("!tests")
    @ConditionalOnProperty(name = "enabled", havingValue = "true")
    public MyService service() {
        return new MyServiceImpl();
    }

}
Run Code Online (Sandbox Code Playgroud)

...以及一些控制器,只有在初始化 MyService bean 时才应该创建并添加到应用程序上下文中。

@RestController
@ConditionalOnBean(MyService.class)
public class MyController {
   @Autowired
   private MyService service;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常。但偶尔春季启动会跳过 MyController 创建。根据日志 MyService 被创建,但在任何其他 bean(包括所有控制器)之后,最后。

为什么 boot@Configuration之前不处理bean @RestController?谢谢。

dav*_*xxx 6

为什么引导不在@Controller 之前处理@Configuration bean?谢谢。

因为 Spring 并不能保证这一点。
以及本规范中@ConditionalOnBean关于此类问题的警告:

该条件只能匹配到目前为止已由应用程序上下文处理的 bean 定义,因此,强烈建议仅在自动配置类上使用此条件。如果候选 bean 可能是由另一个自动配置创建的,请确保使用此条件的那个 bean 之后运行。

并且您不在自动配置类中使用注释。您确实在用@RestController.

我认为,要实现你的要求,你应该移动@RestController的bean声明@Configuration的是威盛的进口类EnableAutoConfiguration中的条目spring.factories