MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dostosowywanie nazw bean repozytorium Spring Data do użytku z wieloma źródłami danych

Utwórz interfejs repozytorium za pomocą @NoRepositoryBean , sami to podłączymy:

@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}      

Następnie w @Configuration klasy, stwórz instancję 2 ziaren repozytoriów za pomocą MongoRepositoryFactoryBean . Oba repozytoria zwrócą ten sam interfejs Spring Data Repository, ale przypiszemy im różne MongoOperations (tj:szczegóły bazy danych):

@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());
    }
}

Masz teraz 2 ziarna z wyraźnym @Qualifier nazwy, każda skonfigurowana dla różnych baz danych i używająca tego samego modelu.

Możesz je wstrzyknąć za pomocą @Qualifier :

@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;

@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;

Dla uproszczenia, na stałe zakodowałem wartości w klasie konfiguracyjnej, ale możesz je wstrzyknąć z właściwości w application.properties/yml.

Oto modyfikacja, jeśli chcesz stworzyć niestandardową implementację bez utraty korzyści z repozytoriów interfejsu danych Spring. specyfikacja mówi tak:

Utwórz nowy interfejs, który technicznie nie ma nic wspólnego z danymi wiosennymi, stary dobry interfejs:

public interface CustomMethodsRepository {
    public void getById(Model model){
}

Niech interfejs repozytorium rozszerzy ten nowy interfejs:

@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
} 

Następnie utwórz klasę implementacji, która tylko implementuje Twój nie-wiosnowy interfejs danych:

public class ModelMongoRepositoryImpl  implements CustomModelMongoRepository {
    private MongoOperations mongoOperations;

    public ModelMongoRepositoryImpl(MongoOperations mongoOperations) {
        this.mongoOperations = mongoOperations;
    }
    public void getById(Model model){
        System.out.println("test");
    }
}

Zmień konfigurację Java, aby dodać 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();
}

Jeśli nie okablowałeś repozytorium ręcznie za pomocą konfiguracji Java, ta implementacja MUSI nosić nazwę ModelMongoRepositoryImpl aby dopasować interfejs ModelMongoRepository +"Impl" . I będzie obsługiwany automatycznie do wiosny.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. wyklucz pola w agregacji $ lookup

  2. projekcja nie działa z zapytaniem wyszukiwania

  3. Zalecany backend bazy danych dla bloga

  4. Użyj wyniku z mongodb w skrypcie powłoki

  5. Wirtualna populacja z Mongoose