作为一个初学者,刚接触mybaits时,就好奇配置文件到底时如何通过一个package标签,为该包下面所有的实体类绑定别名,即便包内还有层级,也同样会映射。
mybatis启动首先需要加载配置文件,这个过程会在SqlSessionFactoryBuilder().build()方法中执行。
点入build()方法进入源码,里面创建了一个XMLConfigBuilder 的实例,完成并对配置的xml 的解析。并调用其parse()方法根据配置封装需要的类。
点入parse()方法,内部封装了一个parseConfiguration()方法用来装载需要的类。
该方法内部配置了mybatis运行时所需要的数据并封装在Configuration对象中。
找到配置别名的方法,通过字符串,读取已经解析好,封装在XNode对象中的数据。
也就是在mybatis-config.xml中配置的<typeAliases>标签名
在方法内用循环的方式取出<typeAliases>下的子节点数据。
当标签名为package时根据其包名路径调用registerAliases()方法
进入registerAliases()方法 观察resolverUtil.find()方法,该方法装载包下所有类的class实例。
resolverUtil.find()方法内部主要是通过调用 VFS.getInstance().list(path)扫描包路径下所有文件的路径。
判断为Java编译文件的则执行addIfMatching()方法
addIfMatching()方法内部主要使用反射技术,通过类的路径,获取该类的class实例,并添加到set集合中。
获取类的class实例集合后,回到registerAliases()方法。使用foreach为class实例执行
registerAlias()的重载方法
该方法内部则创建了Alias实例,对类的Class实例进行封装。
并添加到mybatis的数据类型集合中。
该集合中封装着mybatis运行所需要的基础类的别名,以及在mybatis-config配置的别名。
通过包的路径读取包下所有的文件路径,根据文件路径通过反射技术获取类的class实例,别名绑定类的class实例,以支持mybatis在运行中实现各种需求。
以上,便是这次读mybatis源码的收获。