日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记一次mongoDB-@Document(collection = “XXX“)配置的探索

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记一次mongoDB-@Document(collection = “XXX“)配置的探索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

直接開門見山,大多數(shù)會用mongoDB開發(fā)的都知道實體類上加上

@Document(collection = “XXX”)

可以直接將操作指定到對應(yīng)的XXX 集合中,但是對應(yīng)第一次玩mongoDB的我卻渾然不知(留下沒有技術(shù)的眼淚)。起因是因為每次調(diào)用都需要指定collectionName,如下

Long totalCount = mongoOperations.count(query, reqDTO.getClass(),"refund_error"); List<OperatorBillingSummaryPO> list = mongoOperations.find(query, OperatorBillingSummaryPO.class,"operator_billing_summary");

如果不指定collectionName則用默認的類名(等下會講到源碼)
對于處女座的我而言看著特別不舒服,很想把他們?nèi)恳?guī)整化,于是便有了以下的探索

1、方案一

首先我第一個想到的是將MongoOperations(或者MongoTemplate)在業(yè)務(wù)代碼上所用到
操作(新增修改查詢那些)全部用統(tǒng)一MongoDBUtil工具類封裝,每次都通過工具類進行操作,collectionName 則通過枚舉匹配,或者傳入Class類的類名進行分解拆分(這種方法比較土),將RefundErrorInfoBO 轉(zhuǎn)成 refund_error 類似這樣,除此之外,也可以用ThreadLocal或者緩存的方式查詢,因為思路比較簡單就不貼代碼了。

2、方案二

由于方案一不合適,直接去spring-data-mongodb的官網(wǎng)搜(https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.mapping-usage.events),


于是發(fā)現(xiàn)有個生命周期事件,可通過繼承 AbstractMongoEventListener 事件監(jiān)聽器進行事件監(jiān)聽,不過只能拿到event事件的實體source、事件處理后的Document以及我朝思暮想的collectionName,但并不能設(shè)置具體值,MongoMappingEvent 類如下

public class MongoMappingEvent<T> extends ApplicationEvent {private static final long serialVersionUID = 1L;private final @Nullable Document document;private final @Nullable String collectionName;/*** Creates new {@link MongoMappingEvent}.** @param source must not be {@literal null}.* @param document can be {@literal null}.* @param collectionName can be {@literal null}.*/public MongoMappingEvent(T source, @Nullable Document document, @Nullable String collectionName) {super(source);this.document = document;this.collectionName = collectionName;}/*** @return {@literal null} if not set.*/public @Nullable Document getDocument() {return document;}/*** Get the collection the event refers to.** @return {@literal null} if not set.* @since 1.8*/public @Nullable String getCollectionName() {return collectionName;}/** (non-Javadoc)* @see java.util.EventObject#getSource()*/@SuppressWarnings({ "unchecked" })@Overridepublic T getSource() {return (T) super.getSource();} }

3、方案三

最直接的方法,也就是看源碼
首先從find方法入手
org.springframework.data.mongodb.core.MongoTemplate#find(org.springframework.data.mongodb.core.query.Query, java.lang.Class)

進入設(shè)置方法
org.springframework.data.mongodb.core.MongoTemplate#determineCollectionName

獲取PersistentEntity
org.springframework.data.mapping.context.MappingContext#getRequiredPersistentEntity(java.lang.Class<?>)
從Debug模式進入可以看到已經(jīng)獲取到collection了(此時已添加@Document(collection = “refund_error”)注解)

于是返回上層的設(shè)置方法
org.springframework.data.mapping.context.AbstractMappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation<?>)
entity不為空,在此退出,可以看到entity是通過AbstractMappingContext內(nèi)置的HashMap常量persistentEntities獲取到的

persistentEntities是怎么設(shè)置進來的呢?點擊可以看到調(diào)用的put方法,在此方法下
org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(org.springframework.data.util.TypeInformation<?>)

entity還是被設(shè)置了,繼續(xù)往上看createPersistentEntity方法

createPersistentEntity有三個實現(xiàn)類,看MongoMappingContext的方法
org.springframework.data.mongodb.core.mapping.MongoMappingContext#createPersistentEntity
,此時還是被設(shè)置
繼續(xù)往上,終于找到了~

此方法的意思是使用給定的 TypeInformation 創(chuàng)建一個新的 BasicMongoPersistentEntity。如果@Document設(shè)置了collection則用設(shè)置的值,沒有則將集合名稱設(shè)為實體類型名,實體名則用org.springframework.data.mongodb.MongoCollectionUtils#getPreferredCollectionName獲取,并將首字母大寫字母轉(zhuǎn)為小寫。

至于org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(java.lang.Class<?>)什么時候調(diào)用的,則是在SpringAOP初始化bean時,會調(diào)用初始化方法afterPropertiesSet

進而進入
org.springframework.data.mapping.context.AbstractMappingContext#initialize
,再調(diào)用org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(java.lang.Class<?>)實現(xiàn)整個屬性的設(shè)置

思路比較簡單,有疏漏的望各位大佬指點,小弟先告退了

總結(jié)

以上是生活随笔為你收集整理的记一次mongoDB-@Document(collection = “XXX“)配置的探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久久久久久久久久久久 | av一二三 | 久久r精品| 波多野结衣在线观看一区 | 国产久视频 | 国产成人精品视频一区二区 | 伊人春色在线观看 | 亚洲自拍p | 偷偷操99 | 麻豆91在线播放 | 天天色小说 | 人人澡超碰碰 | 九九在线 | 日本精品一区二区三区四区 | 欧美成人三级在线观看 | 午夜激情视频在线观看 | 国产口爆吞精一区二区 | www.爱操| 一级大片免费观看 | 婷婷亚洲视频 | 天海翼av在线播放 | jlzzjlzz欧美大全 | 综合网久久 | 色综合久久网 | 欧美日本韩国一区二区三区 | 亚洲综合成人网 | 亚洲av中文无码乱人伦在线观看 | 少妇被躁爽到高潮 | 自偷自拍av | 国产精品国产一区二区 | 成人手机视频在线观看 | 精品久久国产字幕高潮 | 视频免费在线观看 | 日本国产一区二区三区 | 在线免费av网址 | 在线免费观看黄色av | 中文字幕+乱码+中文乱码91 | 亚洲av综合一区 | 日本福利社| 色婷婷国产精品久久包臀 | 精品一区二区三区国产 | 五月综合激情网 | 婷婷综合五月天 | 国产经典久久久 | xxx性视频| 久久第一页 | 天堂网站 | 亚洲色图偷 | 亚洲第一福利视频 | 精品777| 国产精品久久毛片 | 欧洲在线一区 | 欧美另类自拍 | 久久久久久久偷拍 | 乳罩脱了喂男人吃奶视频 | 亚洲综合一 | 天天做天天爽 | 亚洲国产成人精品女人久久 | 高潮白浆女日韩av免费看 | 国产精品视频久久久久 | 热逼视频| 中文精品在线 | 欧美极品videos精品 | 国产情侣一区二区三区 | 99re久久精品国产 | 国产精品久久久av | 天天插插| 手机av免费在线 | 992在线观看 | 姝姝窝人体www聚色窝 | 北条麻妃av在线播放 | 男人猛进女人爽的大叫 | 久久中文字幕在线观看 | 日韩一级色片 | 久久亚洲AV成人无码国产野外 | 午夜精品一区二区三区免费视频 | 国产精品一二 | 国产精品一区二区在线观看 | 无码人妻h动漫 | 日韩第四页 | 亚洲熟女乱综合一区二区三区 | 成年人在线观看视频免费 | 天天看天天摸 | 美女在线观看www | 一级黄色片免费 | 欧洲熟妇精品视频 | 九色tv| 99国产精品白浆在线观看免费 | 国产精品一区二区三区免费看 | 日韩久久毛片 | 在线免费观看av网站 | 你懂的网站在线 | 美女扒开尿口让男人捅爽 | 都市豪门艳霸淫美妇 | 日日干综合 | 91久久精品日日躁夜夜躁欧美 | 精品欧美一区二区精品少妇 | 色悠悠国产| www.在线视频 |