MyBatis XMLConfigBuilder 是如何解析 MyBatis 配置文件的? 它读取了哪些信息? 如何将这些信息存储到 Configuration 对象中?

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> 配置信息 (包括 transactionManagerdataSource) 存储到 Configuration 对象的 environment 属性 (一个 Environment 对象) 中。
      • 根据 <environments default="...">default 属性,设置 Configuration 对象当前使用的 environment
  • <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 属性中。

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 映射、全局设置等所有关键信息。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值