MongoTemplate手动动态创建(简版)

news2024/11/15 9:13:31

1、背景

最近遇到一个需求,就是动态获取springboot中MongoTemplate,有哪些mongo数据库在项目启动的时候不确定,运行过程中有可能会增加,也有可能减少。只能通过一个接口获取所有mongo数据库的地址。但是springboot本身提供的mongTemplate配置都是写死的。所以需要自己实现MongoTemplate的创建。

2、依赖情况

下面是我使用的springboot版本和mongo依赖信息

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/> 
    </parent>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

3、开发思路

既然需要创建MongoTemplate,那么肯定要看一下MongoTemplate的构造器方法,查看代码如下:

可以看到这里有四种实现方式,第一种主要依赖于MongoClient,后三种主要依赖于MongoDatabaseFactory,第一种方式我没有尝试,不过看了传参,构建起来也是比较简单的。这里我选择的是第二种实现方式,即创建一个MongoDatabaseFactory对象。再看一下该对象的结构信息:

 可以看到MongoDatabaseFactory是一个接口类,其有多个实现类,需要关注的有两个,一个是GridFsMongoDatabaseFactory,它就是springboot自动创建mongoTemplate时使用的工厂对象(这里用不上,主要是参考)。另外一个是SimpleMongoClientDatabaseFactory对象,它是一个简单的工厂类,只需要传递连接url就可以。这里为了便于演示,我使用的就是该对象。下面来看下具体的代码:

import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MongoClientUtils {
    private static Map<String,MongoTemplate> map = new HashMap<>();

    public static MongoTemplate getMongoTemplate(String host)
    {
        if (!map.containsKey(host)){
//            String url = "mongodb://username:password@127.0.0.1:27017/dbname";
            String url = "mongodb://127.0.0.1:27017/admin";
            MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(url);
            return new MongoTemplate(factory);
        }
        return map.get(host);
    }

    public static void main(String[] args) {
        MongoTemplate mongoTemplate = getMongoTemplate("127.0.0.1");
        if (mongoTemplate!=null){
            Set<String> names = mongoTemplate.getCollectionNames();
            for (String name:names) System.out.println(name);
        }
        System.out.println(123);
    }

}

4、总结

这里只是演示了动态创建使用的过程,具体使用时还需要加一些逻辑判断和url拼接等流程,另外还可以设置一些客户端连接参数,比如超时时间等,这些配置可以在MongoClient或者其它的构造器中配置。具体的可以按照上面的思路点开对应的构造器查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

panda3d 模型转换命令复习学习

在此学习了把maya模型转换为panda3d的egg格式&#xff1b; 在Panda3d中转换Maya模型为egg格式并使用pview查看_panda3d egg文件浏览器_bcbobo21cn的博客-CSDN博客 下面继续看一下模型转换命令&#xff1b;列出带 egg 字符串的命令&#xff1b; 先复习一下&#xff0c;可以把m…

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用 xxl是xxl-job的开发者大众点评的【许雪里】名称的拼音开头 官网地址 分布式任务调度平台XXL-JOB 文档地址…

响应数据加密解决方案

需求分析 响应数据加密是一种很重要的安全措施,可以保护数据在传输过程中不被未经授权的用户拦截、窃取或篡改。以下是响应数据加密需求分析: 响应数据必须进行加密: 所有响应数据必须进行加密,以保证数据在传输过程中的安全性。服务器可以采用HTTPS协议对响应数据进行加密…

剑指 Offer 46: 把数字翻译成字符串

这道题先画模型 假设3个数&#xff0c;第一个第二个可以组&#xff0c;第二个第三个可以组。所以有3种 123 && 字母3 && 1字母 当发现有两种操作方法&#xff0c;说明当前方法出错误了&#xff0c;必须立即想别的办法&#xff01; 除了使用一直除外&#xff…

ad18报错:net antennae:track

画了板子之后发现有这个错误提示&#xff0c;看了图&#xff0c;发现是在一个焊盘下面有2根残留的线&#xff0c;而且线边上出现了天线标志 net antennae的含义是网络天线&#xff0c;这里可以理解为板卡上某个网络的布线形成了天线&#xff0c;但是没有特别标注这一部分是天线…

【Mysql】MySQL体系结构,InnoDB、MyISAM存储引擎,索引结构、分类、语法、性能分析

1. MySQL体系结构 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层…

(五)Web_Server+网页可视化展示

第一步&#xff1a;先使用nodeJS获取mqtt转发的数据&#xff1a;添加链接描述 第二步&#xff1a;使用fs库&#xff0c;将数据存入txt文件(接上一步,这里没处理数据格式&#xff0c;只是测试) var fsrequire("fs");const mqtt require(mqtt) //存储订阅的消息 var …

Android ConstrainLayout布局中View位置的介绍与使用

一、介绍 ConstrainLayout是一款布局View&#xff0c;再Design库中&#xff0c;现已被大家广泛接受并使用。ConstrainLayout的布局采用的方式和其他都不同&#xff0c;他的对其方式是类似RelativeLayout&#xff0c;但是和RelativeLayout有明显的区别。 在布局渲染的时候&#…

获取Xilinx FPGA芯片IDCODE的4种方法(支持任何FPGA型号)

文章目录 方式1&#xff1a;官方文档方式2&#xff1a;一个头文件方式3&#xff1a;BSDL文件方法4&#xff1a;芯片IDCODE在线搜索网站Xilinx FPGA部分型号IDCODE汇总 方式1&#xff1a;官方文档 对于常用的Spartan-6系列可以在UG380文档中找到对应的IDCODE&#xff0c;Sparta…

CM+CDH 构建企业大数据平台

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

电磁阀位、通、开/闭原理精髓

一、引用 电磁阀在液/气路系统中&#xff0c;用来实现液路的通断或液流方向的改变&#xff0c;它一般具有一个可以在线圈电磁力驱动下滑动的阀芯&#xff0c;阀芯在不同的位置时&#xff0c;电磁阀的通路也就不同。 阀芯在线圈不通电时处在甲位置&#xff0c;在线圈通电时处在…

ChatGPT助力校招----面试问题分享(八)

1 ChatGPT每日一题&#xff1a;有源和无源滤波器 问题&#xff1a;有源和无源滤波器的区别 ChatGPT&#xff1a;有源滤波器和无源滤波器是指使用不同的电路元件来实现滤波功能的电路 有源滤波器使用了一个或多个有源元件&#xff0c;例如晶体管、运算放大器等&#xff0c;以…

浅浅总结一下雅思听力技巧

1. 地图题 读题步骤要明确 &#xff08;1&#xff09;看图&#xff0c;要看看题目中是否有东南西北的标志&#xff0c;如果有的话&#xff0c;那么大概率题目中就会用到。同时也标记好左右的标志&#xff0c;防止考试的时候太紧张分不清。 弄清楚个元素的相对位置&#xff0…

华为OD机试真题 Python 实现【开心消消乐】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 给定一个N行M列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为0或1。矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的1进行…

卷积神经网络--猫狗系列之构建模型【ResNet50】

在上一期&#xff1a;卷积神经网络--猫狗系列之下载、导入数据集&#xff0c;如果测试成功就说明对数据的预处理工作已经完成&#xff0c;接下来就是构建模型阶段了&#xff1a; 据说建立一个神经网络模型比较简单&#xff0c;只要了解了各层的含义、不同层之间参数的传递等等&…

leetcode 1232. 缀点成线

题目描述解题思路执行结果 leetcode 1232. 缀点成线 题目描述 缀点成线 给定一个数组 coordinates &#xff0c;其中 coordinates[i] [x, y] &#xff0c; [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断&#xff0c;这些点是否在该坐标系中属于同一条直线上。 示例 1&a…

进程的调度常用算法

目录 先来先服务&#xff08;FCFS&#xff09;调度算法 短作业优先&#xff08;SJF&#xff09;的调度算法 基于时间片的轮转调度&#xff08;RR&#xff09;算法 先来先服务&#xff08;FCFS&#xff09;调度算法 系统将按照作业到达的先后次序来进行作业调度&#xff0c;或…

RT-Thread 5.0.1 qemu-virt64-aarch64 解决网络问题

参考文章 qemu 源码编译 qemu-system-aarch64 的方法 RT-Thread 5.0.1 qemu-virt64-aarch64 解决编译问题 前言 最近需要使用 RT-Thread qemu-virt64-aarch64&#xff0c;验证 aarch64 平台&#xff0c;也就是 ARM64 平台的一些网络功能&#xff0c;需要开启 qemu-virt64-aa…

UE4/5用贴图和GeneratedDynamicMeshActor曲面细分与贴图位移制作模型

目录 制作逻辑&#xff1a; ​编辑 曲面细分函数&#xff1a; 添加贴图逻辑&#xff1a; 代码&#xff1a; 制作逻辑&#xff1a; 在之前的文章中&#xff0c;我们使用了网格细分&#xff0c;而这一次我们将使用曲面细分函数&#xff0c;使用方法和之前是一样的&#xff1a…

高精度定位|RTK定位模块常见应用领域_厘米级室外定位解决方案

在室外场景&#xff0c;北斗、GPS等GNSS定位技术在持续的演变&#xff0c;精度越来越高&#xff0c;应用面也越来越广。随着新基建热潮的到来&#xff0c;借助5G新基建&#xff0c;无人驾驶、自动驾驶等技术正在逐步完善&#xff0c;对于定位的需求已经不仅仅只是粗略的轨迹&am…