【问题标题】:How to delay beans until all spring cloud connectors scan is finished?如何延迟 bean 直到所有 Spring Cloud 连接器扫描完成?
【发布时间】:2017-06-30 13:00:50
【问题描述】:

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

"service" 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);
  }
}

我对这个Bean 做了什么,所以它在cloud 服务(使用spring-cloud-connectors)之前没有处理,s3 仍然为空?

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

我需要类似...

@ProcessAfter(CloudAutoConfiguration.class)

但是在Spring Boot / Spring Cloud 中实际上如何做到这一点?

【问题讨论】:

  • 那么,你不能用@DependsOn("beanB")注解做到这一点,对吧?
  • 是的,@DependsOn 存在 S3 是可选的问题。正如我所看到的,无论如何都过早地检查它(云还不支持属性)..
  • MyService myservice(S3Storage s3) { ... } 不适合你吗?
  • 不,在这种情况下@Autowire 甚至不考虑 'required' = false。
  • 在春季启动的情况下,您可以使用@ConditionalOnBean

标签: java spring spring-boot spring-cloud


【解决方案1】:

在 Spring boot 中,你可以使用 @ConditionalOnBean 文档:http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.html

   @ConditionalOnBean(CloudAutoConfiguration.class)

【讨论】:

  • 不,这对序列没有影响。只是“如果”条件没有帮助。
  • 你可以为订单做 DependsOn 吗?
【解决方案2】:

在这种特殊情况下,除了“所有权倒置”之外,没有什么能帮到我。

我在云服务扫描中更改了@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;
    }
}

因为service 100% 仅通过正常配置配置可选S3Repository,而不是在服务上注册。这解决了 S3 存储库是可选的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2017-08-30
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多