记一次mongoDB-@Document(collection = “XXX“)配置的探索
直接開門見山,大多數會用mongoDB開發的都知道實體類上加上
@Document(collection = “XXX”)
可以直接將操作指定到對應的XXX 集合中,但是對應第一次玩mongoDB的我卻渾然不知(留下沒有技術的眼淚)。起因是因為每次調用都需要指定collectionName,如下
Long totalCount = mongoOperations.count(query, reqDTO.getClass(),"refund_error"); List<OperatorBillingSummaryPO> list = mongoOperations.find(query, OperatorBillingSummaryPO.class,"operator_billing_summary");如果不指定collectionName則用默認的類名(等下會講到源碼)
對于處女座的我而言看著特別不舒服,很想把他們全部規整化,于是便有了以下的探索
1、方案一
首先我第一個想到的是將MongoOperations(或者MongoTemplate)在業務代碼上所用到
操作(新增修改查詢那些)全部用統一MongoDBUtil工具類封裝,每次都通過工具類進行操作,collectionName 則通過枚舉匹配,或者傳入Class類的類名進行分解拆分(這種方法比較土),將RefundErrorInfoBO 轉成 refund_error 類似這樣,除此之外,也可以用ThreadLocal或者緩存的方式查詢,因為思路比較簡單就不貼代碼了。
2、方案二
由于方案一不合適,直接去spring-data-mongodb的官網搜(https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongodb.mapping-usage.events),
于是發現有個生命周期事件,可通過繼承 AbstractMongoEventListener 事件監聽器進行事件監聽,不過只能拿到event事件的實體source、事件處理后的Document以及我朝思暮想的collectionName,但并不能設置具體值,MongoMappingEvent 類如下
3、方案三
最直接的方法,也就是看源碼
首先從find方法入手
org.springframework.data.mongodb.core.MongoTemplate#find(org.springframework.data.mongodb.core.query.Query, java.lang.Class)
進入設置方法
org.springframework.data.mongodb.core.MongoTemplate#determineCollectionName
獲取PersistentEntity
org.springframework.data.mapping.context.MappingContext#getRequiredPersistentEntity(java.lang.Class<?>)
從Debug模式進入可以看到已經獲取到collection了(此時已添加@Document(collection = “refund_error”)注解)
于是返回上層的設置方法
org.springframework.data.mapping.context.AbstractMappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation<?>)
entity不為空,在此退出,可以看到entity是通過AbstractMappingContext內置的HashMap常量persistentEntities獲取到的
persistentEntities是怎么設置進來的呢?點擊可以看到調用的put方法,在此方法下
org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(org.springframework.data.util.TypeInformation<?>)
entity還是被設置了,繼續往上看createPersistentEntity方法
createPersistentEntity有三個實現類,看MongoMappingContext的方法
org.springframework.data.mongodb.core.mapping.MongoMappingContext#createPersistentEntity
,此時還是被設置
繼續往上,終于找到了~
此方法的意思是使用給定的 TypeInformation 創建一個新的 BasicMongoPersistentEntity。如果@Document設置了collection則用設置的值,沒有則將集合名稱設為實體類型名,實體名則用org.springframework.data.mongodb.MongoCollectionUtils#getPreferredCollectionName獲取,并將首字母大寫字母轉為小寫。
至于org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(java.lang.Class<?>)什么時候調用的,則是在SpringAOP初始化bean時,會調用初始化方法afterPropertiesSet
進而進入org.springframework.data.mapping.context.AbstractMappingContext#initialize,再調用org.springframework.data.mapping.context.AbstractMappingContext#addPersistentEntity(java.lang.Class<?>)實現整個屬性的設置
思路比較簡單,有疏漏的望各位大佬指點,小弟先告退了
總結
以上是生活随笔為你收集整理的记一次mongoDB-@Document(collection = “XXX“)配置的探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式项目启动时报错:Duplicate
- 下一篇: Regtech半月观察(9月上)