Erstellen Sie Ihre Repository-Schnittstelle mit @NoRepositoryBean
, verkabeln wir selbst:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}
Dann in einer @Configuration
Klasse, instanziieren Sie die 2 Repository-Beans mit MongoRepositoryFactoryBean
. Beide Repositorys geben dieselbe Spring Data Repository-Schnittstelle zurück, aber wir weisen ihnen unterschiedliche MongoOperations
zu (dh:Datenbankdetails):
@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());
}
}
Sie haben jetzt 2 Beans mit unterschiedlichem @Qualifier
Namen, die jeweils für unterschiedliche Datenbanken konfiguriert sind und dasselbe Modell verwenden.
Sie können sie mit @Qualifier
einfügen :
@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;
@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;
Der Einfachheit halber habe ich die Werte in der Konfigurationsklasse fest codiert, aber Sie können sie aus Eigenschaften in application.properties/yml einfügen.
Hier ist die Änderung, wenn Sie eine benutzerdefinierte Implementierung erstellen möchten, ohne die Vorteile von Spring Data Interface-Repositories zu verlieren. die Spezifikation sagt dies:
Erstellen Sie eine neue Schnittstelle, die technisch nichts mit Federdaten zu tun hat, gute alte Schnittstelle:
public interface CustomMethodsRepository {
public void getById(Model model){
}
Lassen Sie Ihre Repository-Schnittstelle diese neue Schnittstelle erweitern:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
}
Erstellen Sie dann Ihre Implementierungsklasse, die nur implementiert Ihre Nicht-Spring-Daten-Schnittstelle:
public class ModelMongoRepositoryImpl implements CustomModelMongoRepository {
private MongoOperations mongoOperations;
public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
this.mongoOperations = mongoOperations;
}
public void getById(Model model){
System.out.println("test");
}
}
Ändern Sie die Java-Konfiguration, um myFactory.setCustomImplementation(new ModelMongoRepositoryImpl());
hinzuzufügen :
@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();
}
Wenn Sie das Repository nicht manuell über die Java-Konfiguration verbinden, MUSS diese Implementierung ModelMongoRepositoryImpl
heißen passend zur Schnittstelle ModelMongoRepository +"Impl"
. Und es würde bis zum Frühjahr automatisch gehandhabt werden.