@NoRepositoryBean
を使用してリポジトリインターフェースを作成します 、自分で配線します:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}
次に、@Configuration
で クラス、MongoRepositoryFactoryBean
を使用して2つのリポジトリBeanをインスタンス化します 。両方のリポジトリは同じSpringDataRepositoryインターフェースを返しますが、異なるMongoOperations
を割り当てます。 (例:データベースの詳細):
@Configuration
@EnableMongoRepositories
public class MongoConfiguration {
@Bean
@Qualifier("one")
public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
myFactory.setRepositoryInterface(ModelMongoRepository.class);
myFactory.setMongoOperations(createMongoOperations("hostname1", 21979, "dbName1", "username1", "password1"));
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
@Bean
@Qualifier("two")
public ModelMongoRepository modelMongoRepositoryTwo() throws DataAccessException, Exception {
MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
myFactory.setRepositoryInterface(ModelMongoRepository.class);
myFactory.setMongoOperations(createMongoOperations("hostname2", 21990, "dbName2", "username2", "password2"));
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
private MongoOperations createMongoOperations(String hostname, int port, String dbName, String user, String pwd) throws DataAccessException, Exception {
MongoCredential mongoCredentials = MongoCredential.createScramSha1Credential(user, dbName, pwd.toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress(hostname, port), Arrays.asList(mongoCredentials));
Mongo mongo = new SimpleMongoDbFactory(mongoClient, dbName).getDb().getMongo();
return new MongoTemplate(mongo, dbName);
}
//or this one if you have a connection string
private MongoOperations createMongoOperations(String dbConnection) throws DataAccessException, Exception {
MongoClientURI mongoClientURI = new MongoClientURI(dbConnection);
MongoClient mongoClient = new MongoClient(mongoClientURI);
Mongo mongo = new SimpleMongoDbFactory(mongoClient, mongoClientURI.getDatabase()).getDb().getMongo();
return new MongoTemplate(mongo, mongoClientURI.getDatabase());
}
}
これで、異なる@Qualifier
を持つ2つのBeanができました。 それぞれが異なるデータベース用に構成され、同じモデルを使用している名前。
@Qualifier
を使用してそれらを注入できます :
@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;
@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;
簡単にするために、構成クラスに値をハードコーディングしましたが、application.properties/ymlのプロパティから値を挿入できます。
Springデータインターフェイスリポジトリの利点を失うことなくカスタム実装を作成する場合の変更点は次のとおりです。仕様によると:
技術的には春のデータとは関係のない新しいインターフェース、古き良きインターフェースを作成します:
public interface CustomMethodsRepository {
public void getById(Model model){
}
リポジトリインターフェースにこの新しいインターフェースを拡張させます:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
}
次に、実装クラスを作成します。これはのみ スプリングデータ以外のインターフェースを実装します:
public class ModelMongoRepositoryImpl implements CustomModelMongoRepository {
private MongoOperations mongoOperations;
public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
this.mongoOperations = mongoOperations;
}
public void getById(Model model){
System.out.println("test");
}
}
Java構成を変更して、myFactory.setCustomImplementation(new ModelMongoRepositoryImpl());
を追加します。 :
@Bean
@Qualifier("one")
public ModelMongoRepository modelMongoRepositoryOne() throws DataAccessException, Exception {
MongoRepositoryFactoryBean<ModelMongoRepository, Model, String> myFactory = new MongoRepositoryFactoryBean<ModelMongoRepository, Model, String>();
MongoOperations mongoOperations = createMongoOperations("hostname1", 21979, "dbName1", "usdername1", "password1");
myFactory.setCustomImplementation(new ModelMongoRepositoryImpl(mongoOperations));
myFactory.setRepositoryInterface(ModelMongoRepository.class);
myFactory.setMongoOperations(mongoOperations);
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
Java構成を介してリポジトリを手動で配線していない場合、この実装にはModelMongoRepositoryImpl
という名前を付ける必要があります。 インターフェイスに一致するModelMongoRepository +"Impl"
。そして、それは春までに自動的に処理されます。