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.