zoukankan      html  css  js  c++  java
  • Mybaits源码分析五之XMLConfigBuilder类 typeAliases 标签解析

    根据mybatis框架加载流程

    复制代码
     1 private void parseConfiguration(XNode root) {
     2     try {
     3       //解析子节点的properties文件
     4       propertiesElement(root.evalNode("properties"));
     5       //加载用户自定义配置
     6       Properties settings = settingsAsProperties(root.evalNode("settings"));
     7       //加载vfs虚拟文件系统配置
     8       loadCustomVfs(settings);
     9      // 解析子节点typeAliases 别名
    10       typeAliasesElement(root.evalNode("typeAliases"));
    11       //解析子节点plugins 插件
    12       pluginElement(root.evalNode("plugins"));
    13       //解析子节点objectFactory mybatis为结果创建对象时都会用到objectFactory
    14       objectFactoryElement(root.evalNode("objectFactory"));
    15       //解析子节点的封装对象
    16       objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    17       reflectorFactoryElement(root.evalNode("reflectorFactory"));
    18       //解析settings标签的文件配置
    19       settingsElement(settings);
    20       //配置运行环境
    21       environmentsElement(root.evalNode("environments"));
    22       //解析子节点配置数据库供应商
    23       databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    24       //解析对象类型处理器,处理Java的pojo类型与数据库类型的映射
    25       typeHandlerElement(root.evalNode("typeHandlers"));
    26       //解析子节点的mappers
    27       mapperElement(root.evalNode("mappers"));
    28     } catch (Exception e) {
    29       throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    30     }
    31   }
    复制代码
    <typeAliases>标签配置为,在mapper中可以使用别名
    1 <typeAliases>
    2 <!-- 单个别名的定义 alias:别名,type:别名映射的类型 -->
    3     <typeAlias type="com.ssc.demo.mybatis.pojo.Subject" alias="testAlias"></typeAlias>
    4 <!-- 批量别名定义 指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写) -->
    5     <package name="com.ssc.demo.mybatis.pojo"/>
    6 </typeAliases>
    typeAliasesElement方法为
     1 private void typeAliasesElement(XNode parent) {
     2     if (parent != null) {
     3       for (XNode child : parent.getChildren()) {
     4       //如果子节点为 package 属性
     5         if ("package".equals(child.getName())) {
     6            //获取包名
     7           String typeAliasPackage = child.getStringAttribute("name");
     8           //将包名下的类自动扫描pojo,定义别名
     9           configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
    10         } else {
    11         //如果子节点为 typeAlias 
    12           String alias = child.getStringAttribute("alias");
    13           String type = child.getStringAttribute("type");
    14           try {
    15             //创建类实例
    16             Class<?> clazz = Resources.classForName(type);
    17             if (alias == null) {
    18                //如果别名为空,则默认为类名为别名
    19               typeAliasRegistry.registerAlias(clazz);
    20             } else {
    21               typeAliasRegistry.registerAlias(alias, clazz);
    22             }
    23           } catch (ClassNotFoundException e) {
    24             throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
    25           }
    26         }
    27       }
    28     }
    29   }

    在mybatis源码的Configuration类中,对系统常用的配置配置了别名:

     1 //事务方式别名
     2 typeAliasRegistry.registerAlias("JDBC",JdbcTransactionFactory.class);
     3 typeAliasRegistry.registerAlias("MANAGED",ManagedTransactionFactory.class);
     4 //数据源类型别名
     5 typeAliasRegistry.registerAlias("JNDI",JndiDataSourceFactory.class);
     6 typeAliasRegistry.registerAlias("POOLED",
     7 PooledDataSourceFactory.class);
     8 typeAliasRegistry.registerAlias("UNPOOLED",UnpooledDataSourceFactory.class);
     9 //缓存策略别名
    10 typeAliasRegistry.registerAlias("PERPETUAL",PerpetualCache.class);
    11 typeAliasRegistry.registerAlias("FIFO",FifoCache.class);
    12 typeAliasRegistry.registerAlias("LRU",LruCache.class); typeAliasRegistry.registerAlias("SOFT", SoftCache.class); typeAliasRegistry.registerAlias("WEAK", WeakCache.class);
    13 //数据库标识别名
    14 typeAliasRegistry.registerAlias("DB_VENDOR",
    15 VendorDatabaseIdProvider.class);
    16 //语言驱动类别名
    17 typeAliasRegistry.registerAlias("XML",XMLLanguageDriver.class);
    18 typeAliasRegistry.registerAlias("RAW",RawLanguageDriver.class);
    19 //日志类别名
    20 typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
    21 typeAliasRegistry.registerAlias("COMMONS_LOGGTNG",JakartmCommonsLogginglmpl.class);
    22 typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
    23 typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
    24 typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
    25 typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
    26 typeAliasRegistry.registerAlias("NO_LOGGING",NoLoggingImpl.class);
    27 //动态代理别名
    28 typeAliasRegistry.registerAlias("CGLIB",CglibProxyFactory.class);
    29 typeAliasRegistry.registerAlias("JAVASSIST",JavassistProxyFactory.class);
    生于忧患,死于安乐
  • 相关阅读:
    给我买个糖?
    主题反馈
    Git:初始化项目、创建合并分支、回滚等常用方法总结
    tomcat
    tomcat
    docker
    oracle树形结构层级查询之start with ....connect by prior、level、order by以及sys_connect_by_path之浅谈
    java时间类Date、Calendar及用法
    java如何将html过滤为纯文本
    小记Java时间工具类
  • 原文地址:https://www.cnblogs.com/songlove/p/14600745.html
Copyright © 2011-2022 走看看