MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tùy chỉnh tên bean của kho lưu trữ Dữ liệu Mùa xuân để sử dụng với nhiều nguồn dữ liệu

Tạo giao diện kho lưu trữ của bạn với @NoRepositoryBean , chúng tôi sẽ tự kết nối nó:

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

Sau đó, trong một @Configuration lớp, khởi tạo 2 kho lưu trữ đậu bằng MongoRepositoryFactoryBean . Cả hai kho lưu trữ sẽ trả về cùng một giao diện Kho lưu trữ dữ liệu mùa xuân, nhưng chúng tôi sẽ gán chúng MongoOperations khác nhau (ví dụ:chi tiết cơ sở dữ liệu):

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

Bây giờ bạn có 2 hạt đậu với @Qualifier khác biệt tên, mỗi tên được định cấu hình cho các cơ sở dữ liệu khác nhau và sử dụng cùng một mô hình.

Bạn có thể đưa chúng vào bằng cách sử dụng @Qualifier :

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

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

Để đơn giản, tôi đã cố gắng mã hóa các giá trị trong lớp cấu hình, nhưng bạn có thể đưa chúng từ các thuộc tính trong application.properties/yml.

Đây là sửa đổi nếu bạn muốn tạo một triển khai tùy chỉnh mà không làm mất đi lợi ích của kho lưu trữ giao diện dữ liệu mùa xuân. các thông số kỹ thuật cho biết điều này:

Tạo giao diện mới, về mặt kỹ thuật không liên quan gì đến dữ liệu mùa xuân, giao diện cũ tốt:

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

Có giao diện kho lưu trữ của bạn mở rộng giao diện mới này:

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

Sau đó, tạo lớp triển khai của bạn, lớp này chỉ triển khai giao diện dữ liệu không phải mùa xuân của bạn:

public class ModelMongoRepositoryImpl  implements CustomModelMongoRepository {
    private MongoOperations mongoOperations;

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

Thay đổi cấu hình Java để thêm 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();
}

Nếu bạn không đấu dây kho lưu trữ theo cách thủ công thông qua cấu hình Java, triển khai này sẽ PHẢI được đặt tên là ModelMongoRepositoryImpl để khớp với giao diện ModelMongoRepository +"Impl" . Và nó sẽ được xử lý tự động vào mùa xuân.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chạy truy vấn mongodb gốc với trình điều khiển java mongodb

  2. Sự cố kết nối MongoDB trên Azure

  3. Nhóm MongoDB $ và hình thành nhóm rõ ràng với cột được tính toán

  4. Truy vấn đệ quy Mongodb không hoạt động như mong đợi với $ graphLookup

  5. MongoDB Chỉ mục duy nhất trên nhiều trường