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?您至少应该通过删除构造函数依赖性来尝试。谢谢您的回复。我接受了夢のの夢 回答,因为它适合我的情况,是我选择的解决方案。