根据配置文件中的变量使用不同的bean实现

时间:2018-10-02 14:28:37

标签: java spring spring-boot

我有2个豆子:

@Component("FierstClient")
public class FierstClient implements CryptoClient {

@Component("SecondClient")
public class SecondClient implements CryptoClient {

我有服务:

    @Component
    public class CryptoServiceImpl implements CryptoService {

        private final Marshaler marshaler;
        private final CryptoClient cryptoClient;

        public CryptoServiceImpl(Marshaler marshaler, 
                                 @Qualifier("FirstClient") CryptoClient cryptoClient) {
            this.marshaler = marshaler;
            this.cryptoClient = cryptoClient;
        }

现在我有一个任务-控制该bean配置文件。我知道一些解决方案,但对我来说似乎很幼稚:

  1. 创建配置default-server: first // or second并在CryptoServiceImpl中注入2个bean:

    @Qualifier(“ FirstClient”)CryptoClient cryptoClientFirst @Qualifier(“ SecondsClient”)CryptoClient cryptoClientSecond

当我使用它时写:

if(default-server equals first)...else...
  1. 创建Profile。但是,我将有另一个配置,如DB等吗?答:我将有很多组合,例如:
  

FirstClientAndPosgresqlProfile   FirstClientAndOracleProfile   SecondClientAndPosgresqlProfile   SecondClientAndOracleProfile

...

如果我将拥有更多可更改的参数,我将拥有新的配置文件吗?

对于依靠配置文件中的变量使用不同的bean实现可能存在明确的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用类似的东西

ListViewStaggeredLayout

您需要将spanCount属性设置为@Configuration public class ClientConfig { @Bean(name="criptoClient") @ConditionalOnProperty( name = "enabled.client", havingValue = "first") public CryptoClient firstClient() { // return first client } @Bean(name="criptoClient") @ConditionalOnProperty( name = "enabled.client", havingValue = "second") public CryptoClient secondClient() { // return second client } @Bean(name="criptoClient") @ConditionalOnProperty( name = "enabled.client", matchIfMissing = true) public CryptoClient defaultClient() { // return default client } } enable.client。如果该属性不存在,first将被实例化。

另一种方法是将second移到您的DefaultClient定义之上。在这种情况下,您将不再需要上面的@ConditionalOnProperty

@Component