如何在所有Spring云连接器扫描完成之前延迟bean?

时间:2017-02-12 14:36:06

标签: java spring spring-boot spring-cloud

在所有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还是null?

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

我需要像...这样的东西。

@ProcessAfter(CloudAutoConfiguration.class)

但是如何在Spring Boot / Spring Cloud中实际执行此操作?

2 个答案:

答案 0 :(得分:1)

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

   @ConditionalOnBean(CloudAutoConfiguration.class)

答案 1 :(得分:0)

在这种特殊情况下,没有任何东西可以帮助我,但“扭转了所有权”。

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