[Carefree MongoDB] Spring Boot MongoDB 自动化配置

news/2024/2/29 3:06:21

最近在制作一个 spring boot 小应用时使用了 MongoDB,鉴于官方库的简陋配置,决定自己造个轮子,源码发布在 GitHub Carefree MongoDB,jar 已在中央仓库发布,可以直接引用。

English | 中文

Build Status GitHub release nodeHex.pm Hex.pm

Spring Data MongoDB 为面向 MongoDB 的开发提供了一套基于 Spring 的编程模型,在 Spring Boot 中使用 spring-boot-starter-data-mongodb 可以很方便的引入 Spring Data MongoDB 以及 MongoDB Java Driver。

然而,Spring Data MongoDB 只提供了最简单的 MongoDB 客户端选项,且不支持多数据源配置。为了使用连接池、集群等 MongoDB 高级特性,及满足多数据源的需求,我们不得不进行一些额外的配置和编码工作。

Carefree MongoDB 由此而生,除了支持完整的 MongoDB 客户端选项及多数据源配置之外,还提供了一些其它的实用功能。使用后,Carefree MongoDB 将自动创建并注入 MongoTemplate 以及 GridFsTemplate 实例。

快速使用

可以使用 Gradle 或 Maven 快速引入 Carefree MongoDB。将同时引入 spring-data-mongodb 和 mongo-java-driver,因此无需再额外定义二者的引入。

Gradle

compile group: 'org.kweny.carefree', name: 'carefree-mongodb-spring-boot-starter', version: '1.0.1'

Maven

<dependency><groupId>org.kweny.carefree</groupId><artifactId>carefree-mongodb-spring-boot-starter</artifactId><version>1.0.1</version>
</dependency>

@EnableMongoCarefree

在应用主类上添加 @EnableMongoCarefree 注解开启自动配置,同时禁用 Spring Boot 默认的 MongoDB 自动配置——

@EnableMongoCarefree
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

Carefree MongoDB 将自动加载配置文件 application.propertiesapplication.yml 中以 carefree.mongodb 为前缀的属性。

属性名的前缀可自定义,如——

@EnableMongoCarefree("mongodb.custom.prefix")

同时支持占位符,用以引用定义好的属性值,如——

@EnableMongoCarefree("mongodb.${placeholder}.prefix")
@EnableMongoCarefree("${mongodb.placeholder.prefix}")

配置选项

Carefree MongoDB 支持完整的 MongoDB Java Driver 客户端选项,及多数据源配置,同时也提供了一些额外的配置项。

配置示例

application.yml

carefree:mongodb:enable: trueoptions:primary: trueuri: mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]addresses:- 192.168.1.1:27017- 192.168.1.2:27017database: test_dbauth: trueusername: test_userpassword: test_pwdauthentication-mechanism: SCRAM-SHA-1authentication-source: admindescription: some descriptionapplication-name: test appconnect-timeout: 10000socket-timeout: 0max-wait-time: 120000min-connections-per-host: 0max-connections-per-host: 100max-connection-idle-time: 0max-connection-life-time: 0threads-allowed-to-block-for-connection-multiplier: 5heartbeat-frequency: 10000min-heartbeat-frequency: 500heartbeat-connect-timeout: 20000heartbeat-socket-timeout: 20000retry-writes: falsealways-use-m-beans: falsessl-enabled: falsessl-invalid-host-name-allowed: falselocal-threshold: 15server-selection-timeout: 30000server-selector: com.xxx.CustomServerSelectorrequired-replica-set-name: replica_namewrite-concern: w1read-concern: localread-preference: primarycursor-finalizer-enabled: truecommand-listeners:- com.xxx.CustomCommandListenercluster-listeners:- com.xxx.CustomClusterListenerconnection-pool-listeners:- com.xxx.CustomConnectionPoolListenerserver-listeners:- com.xxx.CustomServerListenerserver-monitor-listeners:- com.xxx.CustomServerMonitorListenertype-key: _classgrid-fs-template-name: gridFsTemplategrid-fs-database: test_dbfield-naming-strategy: com.xxx.CustomFieldNamingStrategyoptioned-listeners:- com.xxx.CustomOptionedListener

application.properties

carefree.mongodb.enable=true
carefree.mongodb.options.uri=mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
carefree.mongodb.options.primary=true
carefree.mongodb.options.addresses[0]=192.168.1.1:27017
carefree.mongodb.options.addresses[1]=192.168.1.2:27017
carefree.mongodb.options.database=test_db
carefree.mongodb.options.auth=true
carefree.mongodb.options.username=test_user
carefree.mongodb.options.password=test_pwd
carefree.mongodb.options.authentication-mechanism=SCRAM-SHA-1
carefree.mongodb.options.authentication-source=admin
carefree.mongodb.options.description=some description
carefree.mongodb.options.application-name=test app
carefree.mongodb.options.connect-timeout=10000
carefree.mongodb.options.socket-timeout=0
carefree.mongodb.options.max-wait-time=120000
carefree.mongodb.options.min-connections-per-host=0
carefree.mongodb.options.max-connections-per-host=100
carefree.mongodb.options.max-connection-idle-time=0
carefree.mongodb.options.max-connection-life-time=0
carefree.mongodb.options.threads-allowed-to-block-for-connection-multiplier=5
carefree.mongodb.options.heartbeat-frequency=10000
carefree.mongodb.options.min-heartbeat-frequency=500
carefree.mongodb.options.heartbeat-connect-timeout=20000
carefree.mongodb.options.heartbeat-socket-timeout=20000
carefree.mongodb.options.retry-writes=false
carefree.mongodb.options.always-use-m-beans=false
carefree.mongodb.options.ssl-enabled=false
carefree.mongodb.options.ssl-invalid-host-name-allowed=false
carefree.mongodb.options.local-threshold=15
carefree.mongodb.options.server-selection-timeout=30000
carefree.mongodb.options.server-selector=com.xxx.CustomServerSelector
carefree.mongodb.options.required-replica-set-name=replica_name
carefree.mongodb.options.write-concern=w1
carefree.mongodb.options.read-concern=local
carefree.mongodb.options.read-preference=primary
carefree.mongodb.options.cursor-finalizer-enabled=true
carefree.mongodb.options.command-listeners[0]=com.xxx.CustomCommandListener
carefree.mongodb.options.cluster-listeners[0]=com.xxx.CustomClusterListener
carefree.mongodb.options.connection-pool-listeners[0]=com.xxx.CustomConnectionPoolListener
carefree.mongodb.options.server-listeners[0]=com.xxx.CustomServerListener
carefree.mongodb.options.server-monitor-listeners[0]=com.xxx.CustomServerMonitorListener
carefree.mongodb.options.type-key=_class
carefree.mongodb.options.grid-fs-template-name=gridFsTemplate
carefree.mongodb.options.grid-fs-database=test_db
carefree.mongodb.options.field-naming-strategy=com.xxx.CustomFieldNamingStrategy
carefree.mongodb.options.optioned-listeners[0]=com.xxx.CustomOptionedListener

多数据源

进行多数据源配置时,需要明确指定各数据源的 MongoTemplate Bean 名称。如——

carefree:mongodb:enable: trueoptions:primary: trueuri: xxxmasterTemplate:uri: xxxtestTemplate:uri: yyy

以上配置表示 3 个数据源,将创建 mongoTemplatemasterTemplatetestTemplate 三个 Bean。其中 mongoTemplate 为默认名称,不需要显示声明,当不指定名称时,将以此为名创建并注入。即以下两种配置等价——

carefree.mongodb.options.mongoTemplate.xxx=yyy
carefree.mongodb.options.xxx=yyy

配置说明

关于 MongoDB Java Driver 客户端选项的详细说明可以参考 MongoDB 客户端连接选项 一文。

注:由于官方已对 socket-keep-alive 选项以及 MONGODB-CR 认证方式标注废弃,因此 Carefree MongoDB 也不予支持。

以下将对一些由 Carefree MongoDB 特别处理的配置项进行说明——

  • carefree.mongodb.enable - 用于指示是否开启 Carefree MongoDB 的自动配置。该选项设为 false 时将覆盖 @EnableMongoCarefree 注解并关闭自动配置。默认为 true。
  • uri - MongoDB 的连接字符串,当配置了 uri 时,将忽略 addressesdatabaseusername 等连接相关的配置项,而直接使用 uri 建立连接。
  • auth - 服务端是否需要认证,默认为 false,如果服务端需要认证,请将该选项设为 true,否则即使配置了 usernamepassword 等选项也会被忽略。
  • authentication-mechanism - 服务端认证所采用的算法,可选值为 PLAINGSSAPIMONGODB-X509SCRAM-SHA-1SCRAM-SHA-256注:由于官方已对 MONGODB-CR 认证方式标注废弃,因此 Carefree MongoDB 直接不予支持。
  • server-selector - com.mongodb.selector.ServerSelector 接口实现类的全名。
  • command-listeners - com.mongodb.event.CommandListener 接口实现类的全名,可以指定多个。
  • cluster-listeners - com.mongodb.event.ClusterListener 接口实现类的全名,可以指定多个。
  • connection-pool-listeners - com.mongodb.event.ConnectionPoolListener 接口实现类的全名,可以指定多个。
  • server-listeners - com.mongodb.event.ServerListener 接口实现类的全名,可以指定多个。
  • server-monitor-listeners - com.mongodb.event.ServerMonitorListener 接口实现类的全名,可以指定多个。
  • write-concern - 该选项接受的值形式如下——

    • w1w2w3 ... - 其中的数字可根据实际情况指定。
    • majorityjournal - 分别对应 WriteConcern.MAJORITYWriteConcern.JOURNALED 两种模式。
    • w2-10000-truew2-10000-false - 其中 w2 表示写入模式;10000 表示写入超时时间,即 wtimeout,单位为毫秒;true/false 表示是否需要 journalling。
  • read-concern - 可选值为 localmajoritylinearizablesnapshot
  • read-preference - 该选项接受的值形式如下——

    • primaryprimaryPreferredsecondarysecondaryPreferrednearest - 分别表示主节点、首选主节点、从节点、首选从节点以及最近节点 5 种模式。
    • mode-tagSet-staleness - 这种配置方式在 非 primary 模式下可以指定从哪些节点读取(tagSet)以及容忍的最大延迟(staleness),其中 tagSet 可以指定多个,staleness 单位为毫秒。如 secondary-[{a=0,b=1},{c=3,d=4},{e=5}]-10000secondary-[{a=0,b=1}]secondary-10000
  • type-key - Java 对象存储为 MongoDB 的 Document 时,会同时以一个名为 _class 的字段存储类名。该选项用于指定这个字段的名称,如果设为 false 将不存储这个字段;若为 true 则以默认的 _class 存储;其它值则以指定的值为名存储这个字段。
  • field-naming-strategy - org.springframework.data.mapping.model.FieldNamingStrategy 接口实现类的全名。
  • grid-fs-template-name - 指定该数据源 GridFsTemplate 的 Bean 名称。若不指定则不创建该数据源的 GridFsTemplate。默认的(名为 mongoTemplate)的数据源即使不指定该选项也会创建名为 gridFsTemplate 的 Bean。
  • grid-fs-database - GridFS 数据库名称。默认使用 database 的值。
  • optioned-listeners - org.kweny.carefree.mongodb.MongoCarefreeOptionedListener 接口实现类的全名,可以指定多个。这个监听器于配置选项被加载解析完成后触发,接受 org.kweny.carefree.mongodb.MongoCarefreeStructurecom.mongodb.MongoClientOptions.Builder 两个实例参数,可以在连接、工厂、template 等对象真正创建之前进行一些操作,如手动设置一些没有(无法)通过配置文件来指定的值等。

如果您喜欢我的文章,可以在以下平台关注我——

  • 个人主页:http://kweny.io
  • GitHub:https://github.com/kweny
  • 知乎:https://zhihu.com/people/kweny
  • 思否:https://segmentfault.com/u/kweny
  • 微博:https://weibo.com/kweny
  • 公众号:K栈IO(KwenyIO)

KwenyIO


https://www.jiucaihua.cn/news/show-2093073.html

相关文章

六十五、java版商城之社交种草种草分类Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…

Java多线程简析——Synchronized(同步锁)、Lock以及线程池

Java多线程 Java中&#xff0c;可运行的程序都是有一个或多个进程组成。进程则是由多个线程组成的。最简单的一个进程&#xff0c;会包括mian线程以及GC线程。 线程的状态 线程状态由以下一张网上图片来说明&#xff1a; 在图中&#xff0c;红框标识的部分方法&#xff0c;可以…

六十六、java版商城之社交种草种草管理Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…

ORA-00904: WMSYS.WM_CONCAT: invalid identifier

同事玩Docker&#xff0c;在Docker里面启了一个Oracle 10g Express版本&#xff0c;在测试过程中遇到了ORA-00904: "WMSYS"."WM_CONCAT": invalid identifier错误。 SQL> select * from v$version;BANNER---------------------------------------------…

了解Sql Server的执行计划

阅读目录 如何启动执行计划执行计划结果要看什么Sql Server的五种查询方式查看更具体的执行过程参考资料前一篇总结了Sql Server Profiler&#xff0c;它主要用来监控数据库&#xff0c;并跟踪生成的sql语句。但是只拿到生成的sql语句没有什么用&#xff0c;我们可以利用这些sq…

六十七、java版商城之社交种草种草回复Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…

[RHEL5系统管理攻略]--第2章 磁盘与文件系统管理

RHEL中可能有成千上万的文件必须要存储在磁盘中&#xff1b;对系统管理者而言&#xff0c;如何管理好磁盘与文件系统&#xff0c;也是一门必备的学问。本章我们一起来学习RHEL的磁盘与文件系统必备的知识与技术。2.1 磁盘的管理2.1.1 动态磁盘参数每一个磁盘都会提供一些参数&a…

Web Crawl for Pictures

Python 3.6.3 myConfig.py 1 2 说明3 4 # 被爬取的网站5 homePageUrl http://bbs.fengniao.com6 7 # 存储图片的路径8 imgFolder C:/L/workspace/FirstPython/src/1809 - PetPhoto/img/9 10 # 论坛编号 11 forumNum 30 # 论坛编号 12 13 # 开始页码、结束页码 14 pageBegi…

使用react封装评论组件

首先看我的效果图 我在评论框中输入数据&#xff0c;会在页面进行显示 这个效果图我们进行拆分就是&#xff0c;一个评论组件&#xff0c;一个大的评论列表组件&#xff0c;一个小的评论组件 首先整个页面中有的是我们的评论组件和列表组件 我们输入评论点击的时候会将评论放入…

六十八、java版商城之供求求购管理Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买…
最新文章