使用@NoRepositoryBean
创建您的存储库接口,我们自己来进行连接:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String> {
}
然后,在一个@Configuration
类中,使用MongoRepositoryFactoryBean
实例化2个存储库bean。两个存储库将返回相同的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);
}
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());
}
}
您现在拥有两个具有不同 @Qualifier
名称的豆子,每个豆子都针对不同的数据库进行配置,并使用相同的模型。
您可以使用 @Qualifier
注入它们:
@Autowired
@Qualifier("one")
private ModelMongoRepository mongoRepositoryOne;
@Autowired
@Qualifier("two")
private ModelMongoRepository mongoRepositoryTwo;
为简单起见,我在配置类中硬编码了值,但是您可以从application.properties/yml的属性中注入它们。
编辑以回答评论:
如果您想创建一个自定义实现而不失去spring数据接口存储库的好处,则可以进行修改。规范说:
通常需要为几个仓库方法提供自定义实现。Spring Data存储库很容易允许您提供自定义存储库代码并将其与通用CRUD抽象和查询方法功能集成。为了丰富存储库的自定义功能,您首先定义一个接口和自定义功能的实现。使用您提供的存储库接口来扩展自定义接口。最重要的一点是找到该类的Impl后缀与核心存储库接口上的名称进行比较(请参见下文)。
创建一个新接口,这与spring数据技术实际上没有任何关系,只是普通的接口。
public interface CustomMethodsRepository {
public void getById(Model model){
}
让您的存储库接口扩展此新接口:
@NoRepositoryBean
public interface ModelMongoRepository extends MongoRepository<Model, String>, CustomMethodsRepository {
}
然后,创建您的实现类,该类仅实现您的非Spring Data接口:
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"
。并且Spring会自动处理它。
@Bean
技术对它们进行命名。 - chrylis -cautiouslyoptimistic-