Sto*_*ert 3 java spring dependency-injection spring-boot
有以下情况:
@ConditionalOnBean(ServiceD.class)
@Component
class ServiceAImpl implements ServiceA {
private ServiceB serviceB;
private ServiceC serviceC;
private ServiceD serviceD;
public ServiceA(ServiceB serviceB, ServiceC serviceC, ServiceD serviceD) {
this.serviceB = serviceB;
this.serviceC = serviceC;
this.serviceD = serviceD;
}
}
interface ServiceD {
void doStuff();
}
@Component
class ServiceDImpl implements ServiceD {
private ServiceE serviceE;
public ServiceD(ServiceE serviceE) {
this.serviceE = serviceE;
}
@Override
public void doStuff() {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
仅当存在 serviceD 实现时,我才需要加载 serviceA。
来自@ConditionalOnBean文档:“该条件只能匹配应用程序上下文到目前为止已处理的 bean 定义,因此,强烈建议仅在自动配置类上使用此条件。” 。
我的问题是:由于ServiceD是ServiceA的依赖项,这是否可以保证在@ConditionalOnBean评估时ServiceD已经被应用程序上下文处理?
如果没有,是否有其他方法可以在不使用自动配置类的情况下完成这一任务?
这是一个已知的问题。不能保证 ServiceD bean 会在 ServiceA 之前创建,因为您无法更改 Bean 注册的顺序@ComponentScan。这就是为什么文档说仅在自动配置类上使用条件。因此,您要么必须自动配置 ServiceA,以便所有其他定义的 bean 都在 ServiceA bean 之前定义,要么使用不同的注释,例如@ConditionalOnClass.
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |