Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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@ConditionalOnBean与@Component组合使用_Java_Spring_Spring Boot_Dependency Injection - Fatal编程技术网

Java Spring@ConditionalOnBean与@Component组合使用

Java Spring@ConditionalOnBean与@Component组合使用,java,spring,spring-boot,dependency-injection,Java,Spring,Spring Boot,Dependency Injection,有下一种情况: @ConditionalOnBean(ServiceD.class) @组成部分 类ServiceAImpl实现ServiceA{ 私人服务b服务b; 私人服务; 私人服务; 公共服务A(服务B服务B,服务C服务C,已服务){ this.serviceB=serviceB; this.serviceC=serviceC; 这个。已服务的=已服务的; } } 接口服务{ void doStuff(); } @组成部分 类ServiceDImpl实现了服务{ 私人服务; 公共服务{

有下一种情况:


@ConditionalOnBean(ServiceD.class)
@组成部分
类ServiceAImpl实现ServiceA{
私人服务b服务b;
私人服务;
私人服务;
公共服务A(服务B服务B,服务C服务C,已服务){
this.serviceB=serviceB;
this.serviceC=serviceC;
这个。已服务的=已服务的;
}
}
接口服务{
void doStuff();
}
@组成部分
类ServiceDImpl实现了服务{
私人服务;
公共服务{
this.serviceE=serviceE;
}
@凌驾
公共空间{
//...
}
}
我只需要在存在已服务实现的情况下加载serviceA

@ConditionalOnBean
文档中可以看到:“该条件只能与应用程序上下文迄今为止处理过的bean定义相匹配,因此,强烈建议仅在自动配置类上使用该条件。”

我的问题是: 由于已服务的服务a的依赖项,这是否可以保证当评估
@ConditionalOnBean
时,已服务的将已经由应用程序上下文处理


如果没有,是否有其他方法可以在不使用自动配置类的情况下完成此任务?

这是一个已知的问题。不能保证服务bean会在ServiceA之前创建,因为您不能从
@ComponentScan
更改bean注册的顺序。这就是为什么文档中说只在自动配置类上使用条件的原因。因此,您必须使ServiceA自动配置,以便在serviceabean之前定义所有其他定义的bean,或者使用不同的注释,例如默认情况下
@ConditionalOnClass

Spring管理bean的生命周期并安排其初始化顺序

但是,我们仍然可以根据需要定制它。我们可以选择SmartLifeCycle界面或
@DependsOn
注释来管理初始化顺序


您可以通过使用此注释指定bean依赖项来尝试
@DependsOn
。Spring保证在尝试初始化当前bean之前,将初始化已定义的bean。请参阅

谢谢您的评论。正如
@DependsOn
文档指定的:*在bean不通过属性或构造函数参数显式依赖另一个bean,而是依赖于另一个bean初始化的副作用的情况下,很少使用。**在我的情况下,ServiceD依赖于ServiceA通过构造函数。我是否需要明确使用
@DependsOn
?我仍然不清楚是否需要
@DependsOn
,即使服务依赖于通过构造函数提供的服务A?您至少应该通过删除构造函数依赖性来尝试。谢谢您的回复。我接受了夢のの夢 回答,因为它适合我的情况,是我选择的解决方案。