Project配置为使用多个MongoTemplate
Mongo Ref被传递为
@EnableMongoRepositories(basePackages={"com.mypackage.one"},mongoTemplateRef="mongoTemplateOne")
对于com.mypackage.one包中的存储库
和
@EnableMongoRepositories(basePackages={"com.mypackage.two"},mongoTemplateRef="mongoTemplateTwo")
对于com.mypackage.two包中的存储库
对于标准存储库,它工作正常.但对于我需要自定义行为的场景,我定义了myRepoCustomImpl以及我的自定义行为需求.
问题:我需要访问类似标准存储库的MongoTemplate.
例如
如果MyRepo将MyRepoCustom接口扩展为
@Repository
interface MyRepo extends MongoRepository
MyRepoCustomImpl
@Service
public class MyRepoCustomImpl implements MyRepoCustom{
@Autowired
@Qualifier("mongoTemplateOne")
MongoTemplate mongoTmpl;
@Override
MyEntity myCustomNeedFunc(String arg){
// MyImplemenation goes here
}
}
如果MyRepo在com.mypackage.one包中,mongoTemplateOne将被myRepo使用,所以应该有一些方法让MyRepoCustomImpl知道它也应该使用mongoTemplateOne,每当我在MongoTemplateRef中为MyRepo进行更改时,就像
@EnableMongoRepositories(basePackages={"com.mypackage.one"},mongoTemplateRef="mongoTemplateThree")
现在我需要在MyRepoCustomImpl中对@Qualifier进行更改!
自定义行为有很多回购,因此它变得繁琐乏味.
首先,mongoTemplateRef指的是要使用的@Bean的名称,它不指定MongoTemplate的名称.
您需要提供每个MongoTemplate @Bean,然后在@EnableMongoRepositories注释中引用它.
由于您使用的是spring-boot,因此您可以利用MongoDataAutoConfiguration类.请看看它在这里做了什么https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration.java.
最简单的例子就是这样.
package:com.xyz.repo(此实现依赖于MongoDataAutoConfiguration提供的配置)
@Configuration
@EnableMongoRepositories(basePackages={"com.xyz.repo"}) //mongoTemplateRef defaults to mongoTemplate
public class XyzRepoConfiguration {
}
public abstract class BaseRepo {
@Autowired
MongoTemplate mongoTemplate;
}
@Service
public class MyRepoCustomImpl extends BaseRepo implements MyRepoCustom {
@Override
MyEntity myCustomNeedFunc(String arg){
// access to this.mongoTemplate is present
}
}
包:com.abc.repo
@Configuration
@EnableMongoRepositories(basePackages={"com.abc.repo"},mongoTemplateRef=AbcRepConfiguration.TEMPLATE_NAME)
public class AbcRepoConfiguration {
public static final String TEMPLATE_NAME = "mongoTemplateTwo";
@Bean(name="mongoPropertiesTwo")
@ConfigurationProperties(prefix="spring.data.mongodb2")
public MongoProperties mongoProperties() {
return new MongoProperties();
}
@Bean(name="mongoDbFactoryTwo")
public SimpleMongoDbFactory mongoDbFactory(MongoClient mongo,@Qualifier("mongoPropertiesTwo") MongoProperties mongoProperties) throws Exception {
String database = this.mongoProperties.getMongoClientDatabase();
return new SimpleMongoDbFactory(mongo,database);
}
@Bean(name=AbcRepoConfiguration.TEMPLATE_NAME)
public MongoTemplate mongoTemplate(@Qualifier("mongoDbFactoryTwo") MongoDbFactory mongoDbFactory,MongoConverter converter) throws UnknownHostException {
return new MongoTemplate(mongoDbFactory,converter);
}
}
public abstract class BaseRepo {
@Autowired
@Qualifier(AbcRepoConfiguration.TEMPLATE_NAME)
MongoTemplate mongoTemplate;
}
@Service
public class MyRepoCustomImpl extends BaseRepo implements MyRepoCustom {
@Override
MyEntity myCustomNeedFunc(String arg){
// access to this.mongoTemplate is present
}
}
com.xyz.repo将依赖于application.properties中的spring.data.mongodb属性
com.abc.repo将依赖于application.properties中的spring.data.mongodb2属性
我以前没有使用过AbcRepoConfiguration.TEMPLATE_NAME方法,但它是在我的IDE中编译的.
如果您需要任何澄清,请告诉我.