Créez votre interface de référentiel avec @NoRepositoryBean
, nous le câblerons nous-mêmes :
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}
Puis, dans un @Configuration
class, instanciez les 2 beans du référentiel à l'aide de MongoRepositoryFactoryBean
. Les deux référentiels renverront la même interface Spring Data Repository, mais nous leur attribuerons différents MongoOperations
(c'est-à-dire :détails de la base de données) :
@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());
}
}
Vous avez maintenant 2 beans avec des @Qualifier
distincts noms, chacun configuré pour différentes bases de données et utilisant le même modèle.
Vous pouvez les injecter en utilisant @Qualifier
:
@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;
@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;
Pour plus de simplicité, j'ai codé en dur les valeurs dans la classe de configuration, mais vous pouvez les injecter à partir des propriétés dans application.properties/yml.
Voici la modification si vous souhaitez créer une implémentation personnalisée sans perdre les avantages des référentiels d'interface de données Spring. les spécifications disent ceci :
Créez une nouvelle interface, qui n'a techniquement rien à voir avec les données de printemps, bonne vieille interface :
public interface CustomMethodsRepository {
public void getById(Model model){
}
Demandez à votre interface de référentiel d'étendre cette nouvelle interface :
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
}
Ensuite, créez votre classe d'implémentation, qui uniquement implémente votre interface non-spring-data :
public class ModelMongoRepositoryImpl implements CustomModelMongoRepository {
private MongoOperations mongoOperations;
public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
this.mongoOperations = mongoOperations;
}
public void getById(Model model){
System.out.println("test");
}
}
Modifiez la configuration Java pour ajouter 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();
}
Si vous ne câblez pas le référentiel manuellement via la configuration Java, cette implémentation DOIT être nommée ModelMongoRepositoryImpl
pour correspondre à l'interface ModelMongoRepository +"Impl"
. Et ce serait géré automatiquement au printemps.