如何在spring boot中实现DataSourceAutoConfiguration

时间:2017-02-09 11:31:03

标签: java spring spring-boot datasource microservices

我有5个不同数据库名称的微服务,所以除了每个属性都很常见,因此包含在application.properties

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=${local.db.username:}
spring.datasource.password=${local.db.password:}

我有类commondatasource.java,其中包含属性

@PropertySource({ "classpath:application-test.properties" })
@Component
public  class CommonDataSourceConfig {

    @Autowired
    private Environment env;

    @Primary
      @Bean
      public DataSource dataadmindataSource() 
      {
        final DataSource dataSource = new DataSource();
        dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("spring.datasource.driverClassName")));
        dataSource.setUrl(Preconditions.checkNotNull("spring.datasource.url"));
        dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("spring.datasource.username")));
        dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("spring.datasource.password")));
        }
        }

现在我想在每个微服务datasourceconfig.java中调用 commondatasource

@Configuration
@EnableJpaRepositories(basePackages = {
    "xxx.repositories" }, entityManagerFactoryRef = "xxEntityManager", 
    transactionManagerRef = "xxTransactionManager")
public class xxSourceConfig
{

  @Autowired
  private Environment env;

  @Autowired
  private CommonDataSourceConfig common;

  @Value("${xx.datasource.url}")
  private String url;

  /**
   * Configures the entity manager
   * 
   * @return
   */
  @Primary
  @Bean
  public LocalContainerEntityManagerFactoryBean dataAdminEntityManager()
  {
    LocalContainerEntityManagerFactoryBean entityManager = new LocalContainerEntityManagerFactoryBean();
    entityManager.setDataSource(common.dataadmindataSource());
    entityManager.setPackagesToScan(new String[] { "com.boeing.toolbox.dataadmin.domain" });
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    entityManager.setJpaVendorAdapter(vendorAdapter);
    HashMap<String, Object> properties = new HashMap<String, Object>();
    properties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
    properties.put("hibernate.dialect", env.getProperty("spring.jpa.database-platform"));
    entityManager.setJpaPropertyMap(properties);

    return entityManager;
  }
  }

但现在我想通过这个班级https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

来实现

我是这个概念的新手,对我如何在我的项目中实现上面的课程提供帮助

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题,因为我想删除现有的自定义DataSource配置,而仅依靠DataSourceAutoConfiguration

关键是,如果使用自动配置,

  • DataSource(或EmbeddedDatabaseType)在类路径上;和
  • 您没有配置DataSource bean;和
    • 您已经配置了spring.datasource.type属性(对于Spring Boot 1.3+),或者
    • 有一个受支持的连接池(例如HikariCP或Tomcat连接池),或者
    • 有一个可用的嵌入式(内存中的)数据库驱动程序(例如H2,HSQLDB或Derby)–可能不是您想要的。

在您的情况下,第二个条件失败,因为CommonDataSourceConfig声明了一个DataSource bean。自动配置因此退出。

因此,您应该删除该bean,并通过设置spring.datasource.type或最好在类路径中放置兼容的连接池来确保满足第3个条件。

然后DataSourceAutoConfiguration(根据您的属性)就可以完成工作,并且您应该能够直接使用DataSource注入@Autowired