簡體   English   中英

條件存儲庫注入 - Spring 引導

[英]conditional repository injection - Spring Boot

我有兩個連接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.*

我們可以使用ConditionalOnPropertyConditionalOnExpression在兩個不同的存儲庫實現之間切換。

  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, UserRepositoryMongoUserRepositoryCouch將被自動裝配。 確保只實例化一個 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM