簡體   English   中英

如何在所有Spring雲連接器掃描完成之前延遲bean?

[英]How to delay beans until all spring cloud connectors scan is finished?

所有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做了什么,所以在使用s3但是為null的cloud服務(使用spring-cloud-connectors )之前沒有處理它?

  • 我不能要求s3。 它並不總是配置。
  • 我不能用@Lazy。 來自其他服務的參考......至少會變得混亂(如果可能的話)。

我需要像......

@ProcessAfter(CloudAutoConfiguration.class)

但是在Spring Boot / Spring Cloud實際上是如何實現的呢?

在Spring啟動中,您可以使用@ConditionalOnBean Doc: http//docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.html

   @ConditionalOnBean(CloudAutoConfiguration.class)

在這種特殊情況下,沒有什么能夠幫助我,但“逆轉所有權”。

我在雲服務掃描中更改了@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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM