You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Core无注解初始化MongoClient注入选项及副本集连接池配置

在Spring Core非注解环境下配置带副本集的MongoClient

很乐意为你解答这个问题!在Spring Core环境中不使用注解的话,我们可以通过XML配置文件或者**纯Java配置类(手动注册Bean,不依赖@Component等注解)**来完成MongoClient的初始化,同时注入副本集相关配置,实现主节点故障后的自动切换。

核心思路

我们需要把以下几个组件定义为Spring管理的Bean:

  • MongoClientOptions:配置副本集名称、连接池参数、超时设置等核心选项
  • List<ServerAddress>:副本集所有节点的地址列表
  • MongoClient:依赖上述两个Bean,创建带有副本集感知的客户端实例

方式一:XML配置(纯非注解)

这是传统Spring Core最常用的非注解配置方式,所有Bean都在XML中定义:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 1. 定义副本集单个节点地址 -->
    <bean id="serverAddress1" class="com.mongodb.ServerAddress">
        <constructor-arg value="192.168.5.5"/>
        <!-- 可选:如果端口不是默认27017,添加第二个构造参数 -->
        <!-- <constructor-arg value="27017"/> -->
    </bean>

    <bean id="serverAddress2" class="com.mongodb.ServerAddress">
        <constructor-arg value="192.168.5.6"/>
    </bean>

    <!-- 2. 组装所有节点的列表 -->
    <bean id="serverAddresses" class="java.util.ArrayList">
        <constructor-arg>
            <list>
                <ref bean="serverAddress1"/>
                <ref bean="serverAddress2"/>
                <!-- 可以继续添加更多副本集节点 -->
            </list>
        </constructor-arg>
    </bean>

    <!-- 3. 配置MongoClientOptions,指定副本集名称 + 连接池优化参数 -->
    <bean id="mongoClientOptions" class="com.mongodb.MongoClientOptions" factory-method="builder">
        <property name="requiredReplicaSetName" value="ReplicaSetName"/>
        <!-- 可选:添加实用的连接池参数 -->
        <property name="connectTimeout" value="5000"/> <!-- 连接超时5秒 -->
        <property name="maxConnectionIdleTime" value="300000"/> <!-- 连接空闲超时5分钟 -->
        <property name="maxConnectionPoolSize" value="50"/> <!-- 最大连接数 -->
        <property name="socketTimeout" value="10000"/> <!-- 读写超时10秒 -->
        <property name="heartbeatFrequency" value="10000"/> <!-- 节点心跳检测间隔10秒 -->
        <property name="build" /> <!-- 调用build()方法生成最终实例 -->
    </bean>

    <!-- 4. 初始化MongoClient,注入节点列表和配置选项 -->
    <bean id="mongoClient" class="com.mongodb.MongoClient">
        <constructor-arg ref="serverAddresses"/>
        <constructor-arg ref="mongoClientOptions"/>
        <!-- 可选:添加认证信息,如果集群开启了权限验证 -->
        <!-- <constructor-arg>
            <list>
                <bean class="com.mongodb.MongoCredential">
                    <constructor-arg value="username"/>
                    <constructor-arg value="database"/>
                    <constructor-arg value="password" type="char[]"/>
                </bean>
            </list>
        </constructor-arg> -->
    </bean>

</beans>

方式二:纯Java配置类(无注解扫描)

如果更倾向于用Java代码管理配置,也可以手动创建配置类,通过GenericApplicationContext加载,不需要依赖组件扫描类注解:

public class MongoConfig {

    // 构建副本集节点列表
    public List<ServerAddress> getServerAddresses() {
        List<ServerAddress> seeds = new ArrayList<>();
        seeds.add(new ServerAddress("192.168.5.5"));
        seeds.add(new ServerAddress("192.168.5.6"));
        return seeds;
    }

    // 构建MongoClient配置选项,指定副本集名称
    public MongoClientOptions getMongoClientOptions() {
        return MongoClientOptions.builder()
                .requiredReplicaSetName("ReplicaSetName")
                .connectTimeout(5000)
                .maxConnectionIdleTime(300000)
                .maxConnectionPoolSize(50)
                .socketTimeout(10000)
                .heartbeatFrequency(10000)
                .build();
    }

    // 初始化MongoClient实例
    public MongoClient getMongoClient() {
        return new MongoClient(getServerAddresses(), getMongoClientOptions());
        // 如果需要认证,添加Credential参数
        // return new MongoClient(getServerAddresses(), Arrays.asList(MongoCredential.createCredential("user", "db", "pass".toCharArray())), getMongoClientOptions());
    }
}

然后在应用启动时手动注册Bean到Spring容器:

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new GenericApplicationContext() {
            @Override
            protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
                super.postProcessBeanFactory(beanFactory);
                MongoConfig config = new MongoConfig();
                beanFactory.registerSingleton("serverAddresses", config.getServerAddresses());
                beanFactory.registerSingleton("mongoClientOptions", config.getMongoClientOptions());
                beanFactory.registerSingleton("mongoClient", config.getMongoClient());
            }
        };

        // 从Spring容器获取MongoClient并使用
        MongoClient mongoClient = context.getBean(MongoClient.class);
        // 后续可通过mongoClient获取数据库、集合进行操作
    }
}

关键配置说明

  • requiredReplicaSetName:这个配置是实现主节点自动切换的核心,MongoClient会根据这个名称验证连接的集群身份,并且持续监听集群状态,当主节点故障时,会自动触发副本集选举,切换到新的主节点。
  • 连接池参数:合理配置maxConnectionPoolSize、connectTimeout等参数,可以优化连接复用效率和故障恢复速度。
  • 节点心跳:heartbeatFrequency配置MongoClient检测节点状态的间隔,间隔越短故障发现越快,但会增加集群网络开销,建议根据实际业务场景调整。

内容的提问来源于stack exchange,提问作者jhonsnowky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:25:24