【问题标题】:How to switch between multiple spring boot repository instances如何在多个 Spring Boot 存储库实例之间切换
【发布时间】:2020-04-01 16:02:28
【问题描述】:

我正在努力完成这门课,这将使我能够在存储库之间切换。我不知道该怎么做。我想通过 Spring Boot Injection 使用默认实例!我知道我做错了,我不能将 null 值传递给那些类 init。

@Configuration
public class ApiRepositoryConfig {

    @Bean
    @ConditionalOnProperty(name = "db.dialect", havingValue = "postgres", matchIfMissing = true)
    public ApiRepository apiJpaRepository() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.tw.api");
        return new ApiJpaRepository(ApiApplication.class, emf.createEntityManager());
    }

    @Bean
    @ConditionalOnProperty(name = "db.dialect", havingValue = "mongo")
    public ApiRepository apiMongoRepository() {
        return new ApiMongoRepository(null, null);
    }
}

ApiJpaRepository 类

@NoRepositoryBean
public class ApiJpaRepository<T, Id>
        extends SimpleJpaRepository<T, Id> implements ApiRepository<T, Id> {

    public ApiJpaRepository(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
    }
}

ApiMongoRepository 类

public class ApiMongoRepository<T, Id> extends SimpleMongoRepository<T, Id> implements ApiRepository<T, Id> {

    public ApiMongoRepository(MongoEntityInformation<T, Id> metadata, MongoOperations mongoOperations) {
        super(metadata, mongoOperations);
    }
}

基础接口类

public interface ApiRepository<T, Id> extends CrudRepository<T, Id> {
}

如果有人想要完整的图片,这里是项目链接, https://github.com/er310/boot-camp/tree/master/api

【问题讨论】:

  • medium.com/swlh/… 尝试查看这篇文章作为示例,我认为它足以开始研究
  • @Ishikawa Yoshi - 感谢您的回复,我查看了博客。这是更大的图景,但我想要一些简单的东西,比如在 application.properties 中定义 spring.db.dialact=mongodb。然后conf类相应地设置依赖。
  • 当我理解正确时,this question 是相似的/有希望的
  • ..在当前情况下,您可以(至少)尝试“自动连接”所需的参数(而不是null, null ? ..as the EntityManagerFactory!(不要创建它,“自动接线”它))
  • 你也可以:将@ConditionalOn..注解移动到实现类(*Repository)上(确保组件扫描这些,从@Configuration中省略它们)然后(如果条件正确且排他)弹簧将连接其余部分;)

标签: java spring-boot dependency-injection spring-data-jpa spring-data-mongodb


【解决方案1】:

我通过为每个数据源和指向它们的配置实现工厂 bean 设法解决了这个问题。此外,我不得不从 @SpringBootApplication 中排除 spring jpa 和 mongo 配置。

这里有修复,

https://github.com/er310/boot-camp/tree/master/api

【讨论】:

    【解决方案2】:

    你很亲密。

    1. ConditionalOn..
    //matchIfMissing = true for primary datasource
    @Bean
    @ConditionalOnProperty(value = "db.dialect.postgres.enabled", havingValue = "true", matchIfMissing = true)
    ...
    @Bean
    @ConditionalOnProperty(value = "db.dialect.mongo.enabled", havingValue = "true")
    

    风险:如果某个对多个数据源启用的应用程序最终会崩溃

    1. 弹簧配置文件方法
    @Configuration
    @Profile("mongo")
    public class MongoConfiguration {
        ... all the mongo beans
    }
    

    对于任何其他数据源也是如此
    用法:

    #application.yml
    
    spring:
      profiles:
        active: mongo
    

    我建议使用配置文件,因为更自觉地查看启用或未启用的内容。
    像您或代码审查员肯定会看到您同时激活多个数据库配置文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2018-12-06
      • 2013-10-07
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多