繁体   English   中英

如何在 Spring Boot 中实现 DataSourceAutoConfiguration

[英]how to implement DataSourceAutoConfiguration in spring boot

我有 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

我是这个概念的新手,请帮助解决如何在我的项目中的上述课程中实施

我遇到这个问题是因为我想删除现有的自定义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或在类路径上放置兼容的连接池,也满足第三个条件。

然后DataSourceAutoConfiguration应该完成它的工作(基于您的属性)并且您应该能够直接使用@Autowired注入您的DataSource

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM