Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导条件OnBean注释_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring引导条件OnBean注释

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(); } } 。。。以及一些只有

有spring boot 2.0.2配置

@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的控制器。这很奇怪。