XMLConfigBuilder 是 MyBatis 中负责解析 XML 配置文件(通常是 mybatis-config.xml)的核心组件。 它的主要职责是从 XML 文件中读取 MyBatis 的配置信息,并将这些信息构建并存储到 Configuration 对象中。 Configuration 对象最终会被 SqlSessionFactory 使用,作为 MyBatis 运行时配置的中心仓库。
1. XMLConfigBuilder 如何解析 MyBatis 配置文件:
XMLConfigBuilder 的解析过程主要依赖于 XPath 技术来高效地导航和提取 XML 文件中的数据。 以下是 XMLConfigBuilder 解析 XML 配置文件的详细步骤:
-
1.1. 初始化
XMLConfigBuilder:当
SqlSessionFactoryBuilder调用build(InputStream inputStream)方法时,会首先创建一个XMLConfigBuilder实例,并将配置文件的InputStream传递给它。XMLConfigBuilder parser = new XMLConfigBuilder(inputStream); -
1.2. 调用
XMLConfigBuilder.parse()方法:XMLConfigBuilder的核心解析方法是parse()。 调用parse()方法启动 XML 配置文件的解析过程。Configuration configuration = parser.parse(); -
1.3. 使用 XPath 解析 XML 元素:
XMLConfigBuilder.parse()方法内部会使用 XPath 表达式 来定位和读取 XML 文件中的各个元素。 XPath 允许以路径的方式选择 XML 文档中的节点,使得解析器可以方便地访问和提取特定元素和属性的值。例如,要解析
<properties>元素,XMLConfigBuilder可能会使用 XPath 表达式类似于"configuration/properties"来定位<properties>元素。 -
1.4. 顺序解析 XML 元素 (大致顺序):
XMLConfigBuilder会按照一定的顺序解析 XML 配置文件中的元素,大致顺序如下 (与mybatis-config.xml中元素的建议顺序一致):<configuration>(根元素): 首先解析根元素<configuration>,作为整个配置的入口。<properties>: 解析<properties>元素,加载外部属性文件或<properties>元素内部的属性配置。<settings>: 解析<settings>元素,设置 MyBatis 的全局设置。<typeAliases>: 解析<typeAliases>元素,定义类型别名。<typeHandlers>: 解析<typeHandlers>元素,注册类型处理器。<objectFactory>: 解析<objectFactory>元素,配置对象工厂。<objectWrapperFactory>: 解析<objectWrapperFactory>元素,配置对象包装工厂。<reflectorFactory>: 解析<reflectorFactory>元素,配置反射工厂。<plugins>: 解析<plugins>元素,注册插件 (拦截器)。<environments>: 解析<environments>元素,配置运行环境。<environment>: 解析<environment>子元素,配置具体的运行环境。<transactionManager>: 解析<transactionManager>元素,配置事务管理器。<dataSource>: 解析<dataSource>元素,配置数据源。
<mappers>: 解析<mappers>元素,注册 Mapper 映射器。
-
1.5. 构建
Configuration对象:在解析每个 XML 元素时,
XMLConfigBuilder会根据 XML 元素的内容,调用Configuration对象的相应 API 方法,将解析得到的信息存储到Configuration对象中。 -
1.6. 返回
Configuration对象:XMLConfigBuilder.parse()方法完成 XML 文件的解析后,会将构建好的Configuration对象返回。
2. XMLConfigBuilder 读取了哪些信息 (XML 元素及其含义):
XMLConfigBuilder 主要读取和解析 mybatis-config.xml 配置文件中的以下信息:
-
<configuration>: 根元素,包含所有 MyBatis 配置。 -
<properties>:- 作用: 配置外部属性文件或定义属性变量,用于在其他配置元素中引用。
- 读取信息:
resource属性或url属性:指定外部属性文件路径 (classpath 或 URL)。<property>子元素:定义属性名和属性值。
- 存储到
Configuration对象: 将属性名和属性值存储到Configuration对象的variables属性 (一个Properties对象) 中。
-
<settings>:- 作用: 配置 MyBatis 的全局设置,例如缓存、延迟加载、日志等。
- 读取信息:
<setting>子元素:定义设置名 (name) 和设置值 (value)。
- 存储到
Configuration对象: 将设置名和设置值存储到Configuration对象的settings属性 (一个Settings对象) 中。
-
<typeAliases>:- 作用: 为 Java 类型定义别名,简化 Mapper XML 文件中类型名称的使用。
- 读取信息:
<typeAlias>子元素:alias属性:别名。type属性:Java 类型全限定名。
<package>子元素:name属性:包名,MyBatis 会扫描指定包下的所有类,并自动为其生成别名 (类名的简写)。
- 存储到
Configuration对象: 将别名和对应的 Java 类型注册到Configuration对象的typeAliasRegistry属性 (一个TypeAliasRegistry对象) 中。
-
<typeHandlers>:- 作用: 注册自定义的类型处理器 (TypeHandler),用于处理 Java 类型和 JDBC 类型之间的转换。
- 读取信息:
<typeHandler>子元素:javaType属性 (可选):Java 类型。jdbcType属性 (可选):JDBC 类型。handler属性或内联的类型处理器类:类型处理器类全限定名或类型处理器实例。
<package>子元素:name属性:包名,MyBatis 会扫描指定包下的所有类型处理器,并自动注册。
- 存储到
Configuration对象: 将类型处理器注册到Configuration对象的typeHandlerRegistry属性 (一个TypeHandlerRegistry对象) 中。 可以根据 Java 类型和 JDBC 类型进行注册。
-
<objectFactory>:- 作用: 配置自定义的对象工厂 (ObjectFactory),用于创建结果对象实例。
- 读取信息:
type属性或内联的对象工厂类:对象工厂类全限定名或对象工厂实例。
- 存储到
Configuration对象: 将对象工厂实例设置到Configuration对象的objectFactory属性 (一个ObjectFactory对象) 中。
-
<objectWrapperFactory>:- 作用: 配置自定义的对象包装工厂 (ObjectWrapperFactory),用于创建对象包装器 (ObjectWrapper),控制对象属性的访问方式。
- 读取信息:
type属性或内联的对象包装工厂类:对象包装工厂类全限定名或对象包装工厂实例。
- 存储到
Configuration对象: 将对象包装工厂实例设置到Configuration对象的objectWrapperFactory属性 (一个ObjectWrapperFactory对象) 中。
-
<reflectorFactory>:- 作用: 配置自定义的反射工厂 (ReflectorFactory),用于创建 Reflector 对象,优化反射性能。
- 读取信息:
type属性或内联的反射工厂类:反射工厂类全限定名或反射工厂实例。
- 存储到
Configuration对象: 将反射工厂实例设置到Configuration对象的reflectorFactory属性 (一个ReflectorFactory对象) 中。
-
<plugins>:- 作用: 注册插件 (Interceptor),用于拦截 MyBatis 的执行过程,实现自定义的增强功能。
- 读取信息:
<plugin>子元素:interceptor属性或内联的插件类:插件类全限定名或插件实例。<property>子元素 (可选):插件的配置属性。
- 存储到
Configuration对象: 将插件实例添加到Configuration对象的interceptorChain属性 (一个InterceptorChain对象) 中,形成拦截器链。
-
<environments>:- 作用: 配置 MyBatis 的运行环境,可以配置多个环境 (例如
development,production),并指定当前使用的环境。 - 读取信息:
default属性:指定默认使用的环境 ID。<environment>子元素:id属性:环境 ID。<transactionManager>:配置事务管理器。type属性:事务管理器类型 (例如JDBC,MANAGED)。<property>子元素 (可选):事务管理器的配置属性。
<dataSource>:配置数据源。type属性:数据源类型 (例如UNPOOLED,POOLED,JNDI)。<property>子元素:数据源连接属性 (例如driver,url,username,password)。
- 存储到
Configuration对象:- 将每个
<environment>配置信息 (包括transactionManager和dataSource) 存储到Configuration对象的environment属性 (一个Environment对象) 中。 - 根据
<environments default="...">的default属性,设置Configuration对象当前使用的environment。
- 将每个
- 作用: 配置 MyBatis 的运行环境,可以配置多个环境 (例如
-
<mappers>:- 作用: 注册 Mapper 映射器,关联 Mapper 接口和 SQL 映射文件。
- 读取信息:
<mapper>子元素:resource属性:Mapper XML 文件路径 (classpath)。url属性:Mapper XML 文件 URL。class属性:Mapper 接口类全限定名。<package>子元素:name属性:包名,MyBatis 会扫描指定包下的所有 Mapper 接口,并自动注册。
- 存储到
Configuration对象:- 对于 XML Mapper 文件 (
resource,url): 使用XMLMapperBuilder解析 Mapper XML 文件,并将解析得到的 Mapper 语句 (SQL 映射) 添加到Configuration对象的mapperRegistry属性 (一个MapperRegistry对象) 中。 - 对于 Mapper 接口 (
class,package): 将 Mapper 接口类注册到Configuration对象的mapperRegistry属性中。
- 对于 XML Mapper 文件 (
3. 如何将信息存储到 Configuration 对象中:
XMLConfigBuilder 在解析 XML 配置文件的过程中,会将读取到的信息通过以下方式存储到 Configuration 对象中:
- 直接设置
Configuration对象的属性: 例如,对于<settings>,<objectFactory>,<objectWrapperFactory>,<reflectorFactory>,<environment>等元素,XMLConfigBuilder会创建相应的对象 (例如Settings,ObjectFactory,Environment),并直接设置到Configuration对象的对应属性中。 - 注册到
Configuration对象的注册器 (Registry): 例如,对于<typeAliases>,<typeHandlers>,<mappers>,<plugins>等元素,XMLConfigBuilder会将解析到的类型别名、类型处理器、Mapper 接口/映射、插件等信息注册到Configuration对象的相应注册器对象中 (例如typeAliasRegistry,typeHandlerRegistry,mapperRegistry,interceptorChain)。 这些注册器对象负责管理和维护这些配置信息,并在 MyBatis 运行时提供查询和访问接口。 - 使用
Properties对象存储属性: 对于<properties>元素定义的属性,以及<environment>和<dataSource>中的连接属性等,XMLConfigBuilder会使用Properties对象来存储键值对形式的属性信息,并将Properties对象设置到Configuration对象的variables属性或相关组件的属性中。
总结:
XMLConfigBuilder 是 MyBatis 配置文件的核心解析器。 它使用 XPath 技术高效地解析 XML 文件,读取各种配置信息,并将这些信息以结构化的方式存储到 Configuration 对象中。 Configuration 对象成为了 MyBatis 运行时配置的中心,包含了数据源、事务管理器、Mapper 映射、全局设置等所有关键信息。

884

被折叠的 条评论
为什么被折叠?



