条件存储库注入 - Spring 引导
conditional repository injection - Spring Boot
我有两个存储库接口连接 MongoDB 和 CouchBase :
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.*
我们可以使用 ConditionalOnProperty
或 ConditionalOnExpression
在两个不同的存储库实现之间切换。
如果我们想用简单的属性presence/absence或属性值来控制自动装配,那么可以使用ConditionalOnProperty
。
如果需要复杂的求值,那么我们可以使用ConditionalOnExpression
。
ConditionalOnProperty(presence/absence of a 属性)
@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 被实例化以避免歧义错误。
解决这个问题的另一种尝试。
基于 属性,自动装配的 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;
}
我有两个存储库接口连接 MongoDB 和 CouchBase :
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.*
我们可以使用 ConditionalOnProperty
或 ConditionalOnExpression
在两个不同的存储库实现之间切换。
如果我们想用简单的属性presence/absence或属性值来控制自动装配,那么可以使用
ConditionalOnProperty
。如果需要复杂的求值,那么我们可以使用
ConditionalOnExpression
。
ConditionalOnProperty(presence/absence of a 属性)
@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 被实例化以避免歧义错误。
解决这个问题的另一种尝试。
基于 属性,自动装配的 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;
}