摘要:然而,只提供了最簡單的客戶端選項,且不支持多數據源配置。由此而生,除了支持完整的客戶端選項及多數據源配置之外,還提供了一些其它的實用功能。配置示例多數據源進行多數據源配置時,需要明確指定各數據源的名稱。
最近在制作一個 spring boot 小應用時使用了 MongoDB,鑒于官方庫的簡陋配置,決定自己造個輪子,源碼發布在 GitHub Carefree MongoDB,jar 已在中央倉庫發布,可以直接引用。
English | 中文
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,因此無需再額外定義二者的引入。
Gradlecompile group: "org.kweny.carefree", name: "carefree-mongodb-spring-boot-starter", version: "1.0.1"Maven
@EnableMongoCarefreeorg.kweny.carefree carefree-mongodb-spring-boot-starter 1.0.1
在應用主類上添加 @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.properties 或 application.yml 中以 carefree.mongodb 為前綴的屬性。
屬性名的前綴可自定義,如——
@EnableMongoCarefree("mongodb.custom.prefix")
同時支持占位符,用以引用定義好的屬性值,如——
@EnableMongoCarefree("mongodb.${placeholder}.prefix") @EnableMongoCarefree("${mongodb.placeholder.prefix}")配置選項
Carefree MongoDB 支持完整的 MongoDB Java Driver 客戶端選項,及多數據源配置,同時也提供了一些額外的配置項。
配置示例 application.ymlcarefree: mongodb: enable: true options: primary: true uri: mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]] addresses: - 192.168.1.1:27017 - 192.168.1.2:27017 database: test_db auth: true username: test_user password: test_pwd authentication-mechanism: SCRAM-SHA-1 authentication-source: admin description: some description application-name: test app connect-timeout: 10000 socket-timeout: 0 max-wait-time: 120000 min-connections-per-host: 0 max-connections-per-host: 100 max-connection-idle-time: 0 max-connection-life-time: 0 threads-allowed-to-block-for-connection-multiplier: 5 heartbeat-frequency: 10000 min-heartbeat-frequency: 500 heartbeat-connect-timeout: 20000 heartbeat-socket-timeout: 20000 retry-writes: false always-use-m-beans: false ssl-enabled: false ssl-invalid-host-name-allowed: false local-threshold: 15 server-selection-timeout: 30000 server-selector: com.xxx.CustomServerSelector required-replica-set-name: replica_name write-concern: w1 read-concern: local read-preference: primary cursor-finalizer-enabled: true command-listeners: - com.xxx.CustomCommandListener cluster-listeners: - com.xxx.CustomClusterListener connection-pool-listeners: - com.xxx.CustomConnectionPoolListener server-listeners: - com.xxx.CustomServerListener server-monitor-listeners: - com.xxx.CustomServerMonitorListener type-key: _class grid-fs-template-name: gridFsTemplate grid-fs-database: test_db field-naming-strategy: com.xxx.CustomFieldNamingStrategy optioned-listeners: - com.xxx.CustomOptionedListenerapplication.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: true options: primary: true uri: xxx masterTemplate: uri: xxx testTemplate: uri: yyy
以上配置表示 3 個數據源,將創建 mongoTemplate、masterTemplate、testTemplate 三個 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 時,將忽略 addresses、database、username 等連接相關的配置項,而直接使用 uri 建立連接。
auth - 服務端是否需要認證,默認為 false,如果服務端需要認證,請將該選項設為 true,否則即使配置了 username、password 等選項也會被忽略。
authentication-mechanism - 服務端認證所采用的算法,可選值為 PLAIN、GSSAPI、MONGODB-X509、SCRAM-SHA-1、SCRAM-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 - 該選項接受的值形式如下——
w1、w2、w3 ... - 其中的數字可根據實際情況指定。
majority、journal - 分別對應 WriteConcern.MAJORITY 和 WriteConcern.JOURNALED 兩種模式。
w2-10000-true、w2-10000-false - 其中 w2 表示寫入模式;10000 表示寫入超時時間,即 wtimeout,單位為毫秒;true/false 表示是否需要 journalling。
read-concern - 可選值為 local、majority、linearizable、snapshot。
read-preference - 該選項接受的值形式如下——
primary、primaryPreferred、secondary、secondaryPreferred、nearest - 分別表示主節點、首選主節點、從節點、首選從節點以及最近節點 5 種模式。
mode-tagSet-staleness - 這種配置方式在 非 primary 模式下可以指定從哪些節點讀取(tagSet)以及容忍的最大延遲(staleness),其中 tagSet 可以指定多個,staleness 單位為毫秒。如 secondary-[{a=0,b=1},{c=3,d=4},{e=5}]-10000、secondary-[{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.MongoCarefreeStructure 和 com.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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19387.html
摘要:在日常工作中,我們通過來操作數據庫,在中只需要引入即可。當在一個項目中需要連接多個數據庫的時候,的自動配置無法滿足需求,所以我這邊封裝了一個多數據源的。 在日常工作中,我們通過Spring Data Mongodb來操作Mongodb數據庫,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 然后配置連接信息如下: spring....
摘要:聲明構造函數,作用是把從數據庫取出的數據實例化為對象。該構造函數傳入的值為從中取出的數據省略接口提供增刪改查接口實現提供增刪改查接口實現提供了一個類似于的設計的類。 本文快速入門,MongoDB 結合SpringBoot starter-data-mongodb 進行增刪改查 1、什么是MongoDB ? MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。...
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:容器自動完成裝載,默認的方式是這部分重點在常用模塊的使用以及的底層實現原理。 對于那些想面試高級 Java 崗位的同學來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術的細節和難點成為了主要考察的內容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結打磨了 70 道...
閱讀 830·2021-09-22 15:18
閱讀 1181·2021-09-09 09:33
閱讀 2758·2019-08-30 10:56
閱讀 1184·2019-08-29 16:30
閱讀 1488·2019-08-29 13:02
閱讀 1458·2019-08-26 13:55
閱讀 1643·2019-08-26 13:41
閱讀 1941·2019-08-26 11:56