java - 条件存储库注入(inject) - Spring Boot

标签 java mongodb spring-boot couchbase

我有两个连接 的存储库接口(interface)MongoDB 沙发底座 :

public interface UserRepositoryMongo extends MongoRepository<User, Long> {
}
public interface UserRepositoryCouch extends  CouchbasePagingAndSortingRepository<User, Long> {
}

有没有办法互换@Autowire这些存储库到 UserService有条件?
条件将在 application.properties 内.


**Note :**

*These repositories can have custom methods too.*

最佳答案

我们可以使用 ConditionalOnPropertyConditionalOnExpression在两个不同的存储库实现之间切换。

  • 如果我们想用简单的属性存在/不存在或属性值来控制 Autowiring ,那么 ConditionalOnProperty可以使用。
  • 如果需要复杂的评估,那么我们可以使用 ConditionalOnExpression .

  • ConditionalOnProperty(属性的存在/不存在)
    @Qualifier("specificRepo")
    @ConditionalOnProperty("mongo.url")
    public interface UserRepositoryMongo extends MongoRepository<User, Long>{
    }
    
    @Qualifier("specificRepo")   
    @ConditionalOnProperty("couch.url")
    public interface UserRepositoryCouch extends  CouchbasePagingAndSortingRepository<User, Long>{
    }
    

    ConditionalOnProperty(基于值)
    @ConditionalOnProperty("repo.url", havingValue="mongo", matchIfMissing = true) //this will be default implementation if no value is matching
    public interface UserRepositoryMongo extends MongoRepository<User, Long> {
    }
    
    @ConditionalOnProperty("repo.url", havingValue="couch")
    public interface UserRepositoryCouch extends  CouchbasePagingAndSortingRepository<User, Long> {
    }
    

    条件表达式
    @ConditionalOnExpression("#{'${repository.url}'.contains('couch')}")
    public interface UserRepositoryCouch extends  CouchbasePagingAndSortingRepository<User, Long> {
    }
    

    更新

    使用CrudRepository/Repository根据您的要求输入要注入(inject)的类型。
    public class DemoService {
    
        @Autowired
        @Qualifier("specificRepo")
        private CrudRepository repository;
    }
    

    基于创建的 bean,UserRepositoryMongoUserRepositoryCouch将自动接线。确保只实例化一个 bean 以避免歧义错误。

    关于java - 条件存储库注入(inject) - Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62124675/

    相关文章:

    java - 如何在Spring Boot数据休息中禁用hal浏览器

    java - 如何触发预定的 Spring Batch Job?

    java - If 语句中的二维数组

    node.js - Mongoose 模式中的 `required`是什么意思?

    java - 拆箱如何在短路 boolean 表达式中工作?

    python - 为什么使用 update_one 更新记录会引发 ValueError?

    java - 外部连接到 kubernetes 中的 Mongodb 集群

    Java 存储库 - Spring Data JPA

    java - 套接字异常 : Connection reset - Client Jersey 2. 0 Java 7

    java - 如何使用计时器重新绘制一些 Swing 组件