摘要:然而,只提供了最簡(jiǎn)單的客戶端選項(xiàng),且不支持多數(shù)據(jù)源配置。由此而生,除了支持完整的客戶端選項(xiàng)及多數(shù)據(jù)源配置之外,還提供了一些其它的實(shí)用功能。配置示例多數(shù)據(jù)源進(jìn)行多數(shù)據(jù)源配置時(shí),需要明確指定各數(shù)據(jù)源的名稱。
最近在制作一個(gè) spring boot 小應(yīng)用時(shí)使用了 MongoDB,鑒于官方庫(kù)的簡(jiǎn)陋配置,決定自己造個(gè)輪子,源碼發(fā)布在 GitHub Carefree MongoDB,jar 已在中央倉(cāng)庫(kù)發(fā)布,可以直接引用。
English | 中文
Spring Data MongoDB 為面向 MongoDB 的開(kāi)發(fā)提供了一套基于 Spring 的編程模型,在 Spring Boot 中使用 spring-boot-starter-data-mongodb 可以很方便的引入 Spring Data MongoDB 以及 MongoDB Java Driver。
然而,Spring Data MongoDB 只提供了最簡(jiǎn)單的 MongoDB 客戶端選項(xiàng),且不支持多數(shù)據(jù)源配置。為了使用連接池、集群等 MongoDB 高級(jí)特性,及滿足多數(shù)據(jù)源的需求,我們不得不進(jìn)行一些額外的配置和編碼工作。
Carefree MongoDB 由此而生,除了支持完整的 MongoDB 客戶端選項(xiàng)及多數(shù)據(jù)源配置之外,還提供了一些其它的實(shí)用功能。使用后,Carefree MongoDB 將自動(dòng)創(chuàng)建并注入 MongoTemplate 以及 GridFsTemplate 實(shí)例。
快速使用可以使用 Gradle 或 Maven 快速引入 Carefree MongoDB。將同時(shí)引入 spring-data-mongodb 和 mongo-java-driver,因此無(wú)需再額外定義二者的引入。
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
在應(yīng)用主類上添加 @EnableMongoCarefree 注解開(kāi)啟自動(dòng)配置,同時(shí)禁用 Spring Boot 默認(rèn)的 MongoDB 自動(dòng)配置——
@EnableMongoCarefree @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Carefree MongoDB 將自動(dòng)加載配置文件 application.properties 或 application.yml 中以 carefree.mongodb 為前綴的屬性。
屬性名的前綴可自定義,如——
@EnableMongoCarefree("mongodb.custom.prefix")
同時(shí)支持占位符,用以引用定義好的屬性值,如——
@EnableMongoCarefree("mongodb.${placeholder}.prefix") @EnableMongoCarefree("${mongodb.placeholder.prefix}")配置選項(xiàng)
Carefree MongoDB 支持完整的 MongoDB Java Driver 客戶端選項(xiàng),及多數(shù)據(jù)源配置,同時(shí)也提供了一些額外的配置項(xiàng)。
配置示例 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多數(shù)據(jù)源
進(jìn)行多數(shù)據(jù)源配置時(shí),需要明確指定各數(shù)據(jù)源的 MongoTemplate Bean 名稱。如——
carefree: mongodb: enable: true options: primary: true uri: xxx masterTemplate: uri: xxx testTemplate: uri: yyy
以上配置表示 3 個(gè)數(shù)據(jù)源,將創(chuàng)建 mongoTemplate、masterTemplate、testTemplate 三個(gè) Bean。其中 mongoTemplate 為默認(rèn)名稱,不需要顯示聲明,當(dāng)不指定名稱時(shí),將以此為名創(chuàng)建并注入。即以下兩種配置等價(jià)——
carefree.mongodb.options.mongoTemplate.xxx=yyy
carefree.mongodb.options.xxx=yyy配置說(shuō)明
關(guān)于 MongoDB Java Driver 客戶端選項(xiàng)的詳細(xì)說(shuō)明可以參考 MongoDB 客戶端連接選項(xiàng) 一文。
注:由于官方已對(duì) socket-keep-alive 選項(xiàng)以及 MONGODB-CR 認(rèn)證方式標(biāo)注廢棄,因此 Carefree MongoDB 也不予支持。
以下將對(duì)一些由 Carefree MongoDB 特別處理的配置項(xiàng)進(jìn)行說(shuō)明——
carefree.mongodb.enable - 用于指示是否開(kāi)啟 Carefree MongoDB 的自動(dòng)配置。該選項(xiàng)設(shè)為 false 時(shí)將覆蓋 @EnableMongoCarefree 注解并關(guān)閉自動(dòng)配置。默認(rèn)為 true。
uri - MongoDB 的連接字符串,當(dāng)配置了 uri 時(shí),將忽略 addresses、database、username 等連接相關(guān)的配置項(xiàng),而直接使用 uri 建立連接。
auth - 服務(wù)端是否需要認(rèn)證,默認(rèn)為 false,如果服務(wù)端需要認(rèn)證,請(qǐng)將該選項(xiàng)設(shè)為 true,否則即使配置了 username、password 等選項(xiàng)也會(huì)被忽略。
authentication-mechanism - 服務(wù)端認(rèn)證所采用的算法,可選值為 PLAIN、GSSAPI、MONGODB-X509、SCRAM-SHA-1、SCRAM-SHA-256。注:由于官方已對(duì) MONGODB-CR 認(rèn)證方式標(biāo)注廢棄,因此 Carefree MongoDB 直接不予支持。
server-selector - com.mongodb.selector.ServerSelector 接口實(shí)現(xiàn)類的全名。
command-listeners - com.mongodb.event.CommandListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。
cluster-listeners - com.mongodb.event.ClusterListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。
connection-pool-listeners - com.mongodb.event.ConnectionPoolListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。
server-listeners - com.mongodb.event.ServerListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。
server-monitor-listeners - com.mongodb.event.ServerMonitorListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。
write-concern - 該選項(xiàng)接受的值形式如下——
w1、w2、w3 ... - 其中的數(shù)字可根據(jù)實(shí)際情況指定。
majority、journal - 分別對(duì)應(yīng) WriteConcern.MAJORITY 和 WriteConcern.JOURNALED 兩種模式。
w2-10000-true、w2-10000-false - 其中 w2 表示寫入模式;10000 表示寫入超時(shí)時(shí)間,即 wtimeout,單位為毫秒;true/false 表示是否需要 journalling。
read-concern - 可選值為 local、majority、linearizable、snapshot。
read-preference - 該選項(xiàng)接受的值形式如下——
primary、primaryPreferred、secondary、secondaryPreferred、nearest - 分別表示主節(jié)點(diǎn)、首選主節(jié)點(diǎn)、從節(jié)點(diǎn)、首選從節(jié)點(diǎn)以及最近節(jié)點(diǎn) 5 種模式。
mode-tagSet-staleness - 這種配置方式在 非 primary 模式下可以指定從哪些節(jié)點(diǎn)讀?。╰agSet)以及容忍的最大延遲(staleness),其中 tagSet 可以指定多個(gè),staleness 單位為毫秒。如 secondary-[{a=0,b=1},{c=3,d=4},{e=5}]-10000、secondary-[{a=0,b=1}]、secondary-10000。
type-key - Java 對(duì)象存儲(chǔ)為 MongoDB 的 Document 時(shí),會(huì)同時(shí)以一個(gè)名為 _class 的字段存儲(chǔ)類名。該選項(xiàng)用于指定這個(gè)字段的名稱,如果設(shè)為 false 將不存儲(chǔ)這個(gè)字段;若為 true 則以默認(rèn)的 _class 存儲(chǔ);其它值則以指定的值為名存儲(chǔ)這個(gè)字段。
field-naming-strategy - org.springframework.data.mapping.model.FieldNamingStrategy 接口實(shí)現(xiàn)類的全名。
grid-fs-template-name - 指定該數(shù)據(jù)源 GridFsTemplate 的 Bean 名稱。若不指定則不創(chuàng)建該數(shù)據(jù)源的 GridFsTemplate。默認(rèn)的(名為 mongoTemplate)的數(shù)據(jù)源即使不指定該選項(xiàng)也會(huì)創(chuàng)建名為 gridFsTemplate 的 Bean。
grid-fs-database - GridFS 數(shù)據(jù)庫(kù)名稱。默認(rèn)使用 database 的值。
optioned-listeners - org.kweny.carefree.mongodb.MongoCarefreeOptionedListener 接口實(shí)現(xiàn)類的全名,可以指定多個(gè)。這個(gè)監(jiān)聽(tīng)器于配置選項(xiàng)被加載解析完成后觸發(fā),接受 org.kweny.carefree.mongodb.MongoCarefreeStructure 和 com.mongodb.MongoClientOptions.Builder 兩個(gè)實(shí)例參數(shù),可以在連接、工廠、template 等對(duì)象真正創(chuàng)建之前進(jìn)行一些操作,如手動(dòng)設(shè)置一些沒(méi)有(無(wú)法)通過(guò)配置文件來(lái)指定的值等。
如果您喜歡我的文章,可以在以下平臺(tái)關(guān)注我——
個(gè)人主頁(yè):http://kweny.io
GitHub:https://github.com/kweny
知乎:https://zhihu.com/people/kweny
思否:https://segmentfault.com/u/kweny
微博:https://weibo.com/kweny
公眾號(hào):K棧IO(KwenyIO)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19387.html
摘要:在日常工作中,我們通過(guò)來(lái)操作數(shù)據(jù)庫(kù),在中只需要引入即可。當(dāng)在一個(gè)項(xiàng)目中需要連接多個(gè)數(shù)據(jù)庫(kù)的時(shí)候,的自動(dòng)配置無(wú)法滿足需求,所以我這邊封裝了一個(gè)多數(shù)據(jù)源的。 在日常工作中,我們通過(guò)Spring Data Mongodb來(lái)操作Mongodb數(shù)據(jù)庫(kù),在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 然后配置連接信息如下: spring....
摘要:聲明構(gòu)造函數(shù),作用是把從數(shù)據(jù)庫(kù)取出的數(shù)據(jù)實(shí)例化為對(duì)象。該構(gòu)造函數(shù)傳入的值為從中取出的數(shù)據(jù)省略接口提供增刪改查接口實(shí)現(xiàn)提供增刪改查接口實(shí)現(xiàn)提供了一個(gè)類似于的設(shè)計(jì)的類。 本文快速入門,MongoDB 結(jié)合SpringBoot starter-data-mongodb 進(jìn)行增刪改查 1、什么是MongoDB ? MongoDB 是由C++語(yǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。...
摘要:開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問(wèn)題前后端分離二使用完美處理權(quán)限問(wèn)題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...
摘要:容器自動(dòng)完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實(shí)現(xiàn)原理。 對(duì)于那些想面試高級(jí) Java 崗位的同學(xué)來(lái)說(shuō),除了算法屬于比較「天方夜譚」的題目外,剩下針對(duì)實(shí)際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說(shuō)「天方夜譚」并不是說(shuō)算法沒(méi)用,不切實(shí)際,而是想說(shuō)算法平時(shí)其實(shí)很少用到,甚至面試官都對(duì)自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
閱讀 841·2021-09-22 15:18
閱讀 1196·2021-09-09 09:33
閱讀 2766·2019-08-30 10:56
閱讀 1203·2019-08-29 16:30
閱讀 1499·2019-08-29 13:02
閱讀 1471·2019-08-26 13:55
閱讀 1653·2019-08-26 13:41
閱讀 1950·2019-08-26 11:56