在启动时选择合适的Bean

时间:2018-07-06 11:24:07

标签: java spring-boot

我的应用程序中定义了两个用于DataConnection的Bean。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

public class ApplicationConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource primaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://172.17.0.3:3306/gcdb");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }


    @Bean
    @ConfigurationProperties(prefix="spring.seconddatasource")
    public DataSource secondaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:gcdboff");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }
}

但是因为有时我们没有与Internet的任何连接,所以不是在每次启动时都创建第一个bean,而是由于链接连接错误而崩溃。

我必须做的是,以便我的应用程序无一例外地识别出第一个配置无效,因此必须采取第二个配置。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您不能抛出异常并让Spring Boot搜索另一个bean。

您可以在@Primary DataSource bean中测试两个DataSource,然后返回在线的DataSource。

我已经看到您使用@ConfigurationProperties,所以我想您不会直接在代码中调用dataSource.setPassword。在下面的示例中,所有必需的信息都将从您的配置中读取。

   @Primary
   @Bean
   public DataSource getDataSource(
         @Qualifier("first") DataSourceProperties first,
         @Qualifier("second") DataSourceProperties second) {
      final DataSource firstDataSource = first.initializeDataSourceBuilder().build();
//      try {
//         firstDataSource.getConnection();
//         ...
//      } catch (SQLException e) {
//         ...
//      }

//      return firstDataSource or secondDataSource;
   }

   @Primary
   @Bean("first")
   @ConfigurationProperties(prefix = "spring.datasource")
   public DataSourceProperties  getPrimaryStringProvider() {
      final DataSourceProperties dataSourceProperties = new DataSourceProperties();
      return dataSourceProperties;
   }

   @Bean("second")
   @ConfigurationProperties("spring.seconddatasource")
   public DataSourceProperties getSecondaryStringProvider() {
      return new DataSourceProperties();
   }

LE作为对以下评论的回复:

  

该异常是错误的。他从未进入捕捞区。您必须使用通信异常或其自身的异常。

它将抛出SQLException(更确切地说,对于MySQL,它可能是com.mysql.jdbc.public class CommunicationsException extends java.sql.SQLException)。

  

此外,我还必须在Application类中输入bean。否则,这些豆就永远无法建成。

您只需要用ApplicationConfiguration注释@Configuration

  

我在问题中发布了可行的解决方案

我认为用@ConfigurationProperties(prefix="spring.datasource")注释该方法没有多大意义。退出方法primaryDataSource后,会使用属性文件中存在的所有覆盖函数中设置的值。