Java Spring引导条件OnBean注释
有spring boot 2.0.2配置Java Spring引导条件OnBean注释,java,spring,spring-boot,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(); } } 。。。以及一些只有
@Configuration
public class ApiConfig {
@Bean
@Profile("!tests")
@ConditionalOnProperty(name = "enabled", havingValue = "true")
public MyService service() {
return new MyServiceImpl();
}
}
。。。以及一些只有在myservicebean初始化时才应该创建并添加到应用程序上下文中的控制器
@RestController
@ConditionalOnBean(MyService.class)
public class MyController {
@Autowired
private MyService service;
}
它工作正常。但有时spring boot会跳过MyController创建。根据日志,MyService是创建的,但是在任何其他bean(包括所有控制器)之后,在最后
为什么引导不在@RestController
之前处理@Configuration
bean?
谢谢
为什么引导不在@Controller之前处理@Configuration bean?
谢谢
因为Spring不能保证这一点。以及
@ConditionalOnBean
在以下方面警告此类问题:
该条件只能匹配已修改的bean定义
到目前为止由应用程序上下文处理,因此,它是
强烈建议在自动配置时使用此条件
仅类。如果候选bean可能由另一个创建
自动配置,确保使用此条件的运行
之后
并且在自动配置类中不使用注释。您确实在用@RestController
注释的类中指定了它
我认为为了达到您的要求,您应该在
@Configuration
类中移动@RestController
bean声明,该声明是通过spring.factories中的EnableAutoConfiguration
条目导入的。不幸的是@dependson注释对我的情况不起作用。我还尝试了@ConditionalOnProperty(name=“enabled”,havingValue=“true”)在MyController类上。但它总是错误的,而且从不创建。这不太幸运!这可能意味着@DependsOn
不一定会与@ConditionalOnBean
评估不同。我认为符合文档的要求,使用自动配置类可能是一种方式。我现在没有太多时间进行测试,但这是一种选择非常有趣的事情。我会做一个小测试。@r.r如果你能提供一个在公共github或类似地方复制该问题的最小项目,那就太好了。不幸的是,我无法共享我的项目。我找到了很多答案,其中提到ConditionalOnProperty是禁用/启用CONTRC的正确方法但是这个注释不适用于标记为RestController的控制器。这很奇怪。