2017-02-12 55 views
3

Spring Boot云自动配置完成后,我需要延迟我的应用程序“服务”bean处理。如何延迟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); 
    } 
} 

我有什么做这个Bean所以它不是之前cloud服务(spring-cloud-connectors使用)与S3还没有空处理?

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

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

@ProcessAfter(CloudAutoConfiguration.class) 

但实际上如何在Spring Boot/Spring Cloud这样做呢?

+0

所以,你不能用'@DependsOn(“beanB”)'注解来做到这一点,对吧? – Andremoniy

+0

是的,@DependsOn有问题,S3是可选的。而且我可以看到它在任何情况下都被检查得太早(属性还没有被云支持)。 –

+0

'MyService myservice(S3Storage s3){...}'不适合你吗? – Andremoniy

回答

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)

相关问题