Spring @ConditionalOnBean 与 @Component 结合

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已经被应用程序上下文处理?

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

夢のの*_*のの夢 5

这是一个已知的问题。不能保证 ServiceD bean 会在 ServiceA 之前创建,因为您无法更改 Bean 注册的顺序@ComponentScan。这就是为什么文档说仅在自动配置类上使用条件。因此,您要么必须自动配置 ServiceA,以便所有其他定义的 bean 都在 ServiceA bean 之前定义,要么使用不同的注释,例如@ConditionalOnClass.