MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Персонализиране на имената на bean компонентите на хранилището на Spring Data за използване с множество източници на данни

Създайте интерфейс на вашето хранилище с @NoRepositoryBean , ще го свържем сами:

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

След това в @Configuration клас, създайте екземпляр на 2 компонента на хранилището, като използвате MongoRepositoryFactoryBean . И двете хранилища ще върнат един и същ интерфейс на Spring Data Repository, но ще им присвоим различни 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());
    }
}

Вече имате 2 зърна с различен @Qualifier имена, всяко конфигурирано за различни бази данни и използващо един и същ модел.

Можете да ги инжектирате с помощта на @Qualifier :

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

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

За простота съм кодирал твърдо стойностите в конфигурационния клас, но можете да ги инжектирате от свойствата в application.properties/yml.

Ето модификацията, ако искате да създадете персонализирана реализация, без да губите предимствата на пролетните хранилища на интерфейса за данни. в спецификациите се казва следното:

Създайте нов интерфейс, който технически няма нищо общо с пролетните данни, добрият стар интерфейс:

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

Накарайте интерфейса на вашето хранилище да разшири този нов интерфейс:

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

След това създайте своя клас за внедряване, който само внедрява вашия не-spring-данни интерфейс:

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" . И това ще бъде обработено автоматично до пролетта.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Система за гласуване с Backbone.js

  2. Има ли функция за етаж в рамката за агрегиране на Mongodb?

  3. Mongodb concat int и низ

  4. Как работи параметърът arrayFilters в MongoDB

  5. MongoDB, премахнете обекта от масива