直接开门见山,大多数会用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 类如下

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)

进入设置方法
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“)配置的探索相关推荐

  1. MongoDB:SpringBoot有关@Document(collection = )与@Document(collation= )注解的区别

    目录 QUESTION:SpringBoot有关@Document(collection = "")与@Document(collation= "")注解的区别 ...

  2. win10系统MongoDB 4.0安装配置记录

    1.下载并运行安装文件 MongoDB官方下载地址 下载完成后点击运行msi文件 同意协议,略过不表 选择自定义安装 此处可以查看并自定义安装路径 从 MongoDB 4.0 开始,默认情况下,可以在 ...

  3. Ubuntu下mongodb的安装与配置

    MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便.这里介绍在Ubuntu下mongodb的安装与配置. 1.下载 mongodb可以在官网上下载,地址,选择Ubun ...

  4. MongoDB详细安装与配置

    MongoDB详细安装与配置 下载地址 MongoDB安装 1.双击安装包进行安装 2.点击I accept the tems in the license agreement,点击Next 3.选择 ...

  5. mongodb的安装与配置

    mongodb 的安装与配置 基于centos5.4 一,通过二进制包安装 1, 下载linux 平台下的mongodb http://downloads.mongodb.org/linux/mong ...

  6. python3 [爬虫入门实战]爬虫之mongoDB数据库的安装配置与可视化

    从安装过程到可视化工具可查看数据信息,历时两天,昨天坐了一天的火车,今天早上才到的青岛–> 来放松心情. 前天说是要学习如何使用mongoDB的链接与安装. 到今天过去了将一天, 不过还是在函兮 ...

  7. 记一次 Centos7 yum 安装、配置 PgAdmin4

    一.基础信息说明 官网:https://www.pgadmin.org/ 下载:https://www.pgadmin.org/download/pgadmin-4-windows/ 阿里帮助文档:h ...

  8. MongoDB的安装、配置运行 与 Robomongo的下载安装

    MongoDB的安装.配置运行和特点 Robomongo的下载与安装 特点 MongoDB 的设计目标是高性能.可扩展.易部署.易使用,存储数据非常方便.其主要功能特性如下: (1)面向集合存储,容易 ...

  9. MongoDB的安装与配置(简单版本、Win7)

    大家好,我是邵奈一,一个不务正业的程序猿.正儿八经的斜杠青年. 1.世人称我为:被代码耽误的诗人.没天赋的书法家.五音不全的歌手.专业跑龙套演员.不合格的运动员- 2.这几年,我整理了很多IT技术相关 ...

最新文章

  1. 浅说 XSS 和 CSRF
  2. client中周期性边界_HFSS中周期性边界条件的设置
  3. linux服务器 32核,Intel换成AMD 32核锐龙 Linux之父体验很好
  4. WinJS实用开发技巧(4):Appbar中使用自定义图片
  5. NSString 练习
  6. 【招聘(深圳)】轻岁 诚聘.NET Core开发
  7. LeetCode(38)——报数(JavaScript)
  8. [转]@html.ActionLink的几种参数格式
  9. MD9 入门 制作衣服 笔记
  10. 什么是Zepto.js
  11. 街道设计导则与城市道路系统的优化提升:从通行能力到空间品质的转变
  12. thinkphp5 in_array函数 不区分大小写的实现
  13. 飞秋教程 2013 阳阳整理完整版
  14. 自己动手编译最新Android源码及SDK
  15. 叶俊:没有人会把钱存在有漏洞的账户
  16. 超详细的阿里云服务器购买及远程连接开机(Win系统)
  17. 微信小程序小技巧系列《一》幻灯片,tab导航切换
  18. 计算机启动应用程序的方法,怎么启动Windows应用程序
  19. S3C2450自动升级
  20. 微信婚恋相亲交友小程序

热门文章

  1. 中继器 删除行_Axure9实操教程9-中继器动作(二)
  2. 华为手机微信网络连接到服务器失败怎么办,微信H5支付在华为手机里报错 网络环境未能通过安全验证,请稍后再试 怎么解决啊 试了好多方法也不行...
  3. sql floor 取整函数
  4. ubuntu百度网盘下载大文件
  5. linux~mysql安装、卸载及使用命令
  6. 机器学习笔记 network compression
  7. numpy 笔记:finfo
  8. Java高阶部分知识点汇总(四)-继承与多态
  9. Java实战应用50篇(二)-SSM框架中的设计模式:动态代理
  10. (纯干货)万字长文,数据分析利器 pandas 全教程