Java 如何延迟bean直到所有SpringCloudConnectors扫描完成?

Java 如何延迟bean直到所有SpringCloudConnectors扫描完成?,java,spring,spring-boot,spring-cloud,Java,Spring,Spring Boot,Spring Cloud,在所有Spring Boot云自动配置完成后,我需要延迟我的应用程序“服务”bean处理 “服务”bean既依赖于SQLDataSource,也依赖于其他bean(S3存储库),这是可选的,可以基于云服务配置或直接配置的属性创建(甚至根本不创建)。底层S3和SQL服务都是根据各种外部条件完美配置的。它们在直接、间接属性、云等方面表现良好 所以现在我有点像 @Autowired(required=false) S3Storage s3; @Autowired SQLDatabase db; @

在所有Spring Boot云自动配置完成后,我需要延迟我的应用程序“服务”bean处理

“服务”bean既依赖于SQL
DataSource
,也依赖于其他
bean
(S3存储库),这是可选的,可以基于云服务配置或直接配置的属性创建(甚至根本不创建)。底层S3和SQL服务都是根据各种外部条件完美配置的。它们在直接、间接属性、云等方面表现良好

所以现在我有点像

@Autowired(required=false)
S3Storage s3;

@Autowired
SQLDatabase db;

@Bean
MyService myservice() {
  if (s3 != null) {
    return new SQLWithS3Implementation(db, s3);
  } else {
    return new SQLImplementation(db);
  }
}
@ProcessAfter(CloudAutoConfiguration.class)
我对这个
Bean
做了什么,所以在使用s3的
cloud
服务(
spring cloud connectors
使用)之前它不会被处理

  • 我不能要求s3。它并不总是配置的
  • 我不能用@Lazy。来自其他服务的引用。。。至少会很混乱(如果可能的话)
我需要像

@Autowired(required=false)
S3Storage s3;

@Autowired
SQLDatabase db;

@Bean
MyService myservice() {
  if (s3 != null) {
    return new SQLWithS3Implementation(db, s3);
  } else {
    return new SQLImplementation(db);
  }
}
@ProcessAfter(CloudAutoConfiguration.class)

但是在Spring Boot中如何真正做到这一点呢?

在Spring Boot中,您可以使用@ConditionalOnBean 文件:


在这种特殊情况下,除了“所有权的倒转”,什么也帮不了我

我已经更改了云服务扫描的
@Bean
结果。现在,它创建的不是存储服务信息,而是使用这些属性创建的存储库

@ServiceScan
public class S3CloudCOnfig extends AbstractCloudConfig {

    @Autowired
    @Bean
    public S3Repository s3Repository(final MyService service) {

        // Cloud service configuration.
        S3Properties properties = null;
        try {
        } catch (...) {
            // No service is configured...
        }

        S3Repository result = null;
        if (properties) {
            result = new S3Repository(properties);
            service.setObjectStorage(service);
        }
        return result;
    }
}
As
服务
仅通过正常配置进行100%配置可选
S3Repository
而不是在服务上注册。这解决了S3存储库是可选的问题


service
logics只是说明了S3存储库上的可选策略是可用的。所以没有任何
@Autowired(required=false)

所以,你不能用
@DependsOn(“beanB”)
注释来做这件事,对吧?是的,@DependsOn有问题,S3是可选的。正如我所看到的,在任何情况下检查都太早了(云还不支持属性)…MyService MyService(S3Storage s3){…}对您不起作用吗?不,在这种情况下@Autowire甚至没有考虑“required”=false。在spring引导的情况下,您可以使用@ConditionalOnBeanNo,这对顺序没有影响。只是“如果”的条件,这是没有帮助的。你能为订单做DependsOn吗?