条件存储库注入 - Spring Boot

问题描述 投票:0回答:2

我有两个连接 MongoDBCouchBase 的存储库接口:

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.*
java mongodb spring-boot dependency-injection couchbase
2个回答
15
投票

我们可以使用

ConditionalOnProperty
ConditionalOnExpression
在两个不同的存储库实现之间切换。

  1. 如果我们想通过简单的属性存在/不存在或属性值来控制自动装配,那么可以使用

    ConditionalOnProperty

  2. 如果需要复杂的评估,那么我们可以使用

    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
类型进行注入。

public class DemoService {

    @Autowired
    @Qualifier("specificRepo")
    private CrudRepository repository;
}

基于创建的 bean,

UserRepositoryMongo
UserRepositoryCouch
将被自动装配。确保只有一个 bean 被实例化以避免歧义错误。


5
投票

解决这个问题的另一种尝试。

根据属性,自动装配的 customRepository 将是 SimpleMongoRepository 或 SimpleCouchRepository 的实例。

    public interface CustomRepository extends CrudRepository<User, Long> {
        User findByLastName(String lastName); //custom methods
    }

    @Qualifier("specificRepo")
    @ConditionalOnProperty("mongo.url")
    public interface UserRepositoryMongo extends MongoRepository<User, Long>, CustomRepository{
    }

    @Qualifier("specificRepo")   
    @ConditionalOnProperty("couch.url")
    public interface UserRepositoryCouch extends  CouchbasePagingAndSortingRepository<User, Long>, CustomRepository{
    }

    public class UserService {

        @Autowired
        @Qualifier("specificRepo")
        private CustomRepository repository;
    }
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.