加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – 将MongoTemplate传递给Custom Repository实现

发布时间:2020-12-15 01:33:36 所属栏目:大数据 来源:网络整理
导读:Project配置为使用多个MongoTemplate Mongo Ref被传递为 @EnableMongoRepositories(basePackages={"com.mypackage.one"},mongoTemplateRef="mongoTemplateOne") 对于com.mypackage.one包中的存储库 和 @EnableMongoRepositories(basePackages={"com.mypackag

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进行更改!
自定义行为有很多回购,因此它变得繁琐乏味.

问题:相反,没有任何方法可以根据它扩展到的回购自动注入或解决使用的MongoTemplate?

最佳答案
MongoRemplate接口不公开MongoTemplate.他们可能会暴露MongoTemplate @Bean的名称,这可以为您的问题提供解决方案.但是,鉴于他们没有,我将在下面提供一个可能符合您需求的示例.

首先,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中编译的.

如果您需要任何澄清,请告诉我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读