当前位置: 首页 > news >正文

天津网站建设工作室seo关键词外包

天津网站建设工作室,seo关键词外包,发稿平台,手机网站开放配TypeAliasRegistry源码分析一、引入类型别名二、typeAlias 的三种配置方式三、TypeAliasRegistry源码分析三种配置方式源码解析校验过程Mybatis默认的别名配置四、总结一、引入类型别名 当配置 XML 文件,需要指明Java类型时,类型别名可替代Java类型的全…

TypeAliasRegistry源码分析

  • 一、引入类型别名
  • 二、typeAlias 的三种配置方式
  • 三、TypeAliasRegistry源码分析
    • 三种配置方式源码解析
    • 校验过程
    • Mybatis默认的别名配置
  • 四、总结

一、引入类型别名

当配置 XML 文件,需要指明Java类型时,类型别名可替代Java类型的全名,一般会设置一个简单缩写的类型别名去替代它,用于XML配置,以降低冗余的全限定类名书写。(说白了其作用就是偷懒)

下面是使用全限定类名指定的配置:

    <select id="selectAll" resultType="com.ncpowernode.mybatis.bean.User">select * from t_user;</select>

当在核心配置文件中配置完后:

在这里插入图片描述
即可写成下面的形式:

<select id="selectAll" resultType="user">select * from t_user;
</select>

二、typeAlias 的三种配置方式

  1. type属性和alias属性双搭
<typeAlias type="com.ncpowernode.mybatis.bean.User" alias="user"/>
  1. 直接写type属性指定全限定类名,底层会利用该类的simpleName去当作这个alias。
<typeAlias type="com.ncpowernode.mybatis.bean.User"/>
  1. 直接配置包标签,使得指定包下的所有类都进行别名配置。
<package name="com.ncpowernode.mybatis.bean"/>

三、TypeAliasRegistry源码分析

三种配置方式源码解析

Mybatis通过TypeAliasRegistry对象实现对别名的封装,实现别名对应Java类型的校验。TypeAliasRegistry类中是用一Map成员对象实现上面封装效果的。

public class TypeAliasRegistry {// key对应着别名,Class对应着全限定类名转换的Class对象private final Map<String, Class<?>> typeAliases = new HashMap<>();
}

解析核心配置文件时候支持上面提到的三种设置别名的方式,那自然底层实现也存在三种,但万变不理其中,最后跳转到的代码(核心方法)如下所示:

  public void registerAlias(String alias, Class<?> value) {//判断别名是否为空if (alias == null) {throw new TypeException("The parameter alias cannot be null");}// 将别名都转换为小写存储,利于后续进行校验String key = alias.toLowerCase(Locale.ENGLISH);// 从这段代码可以知道别名可以支持多个对应一个Class对象if (typeAliases.containsKey(key) && typeAliases.get(key) != null && !typeAliases.get(key).equals(value)) {throw new TypeException("The alias '" + alias + "' is already mapped to the value '" + typeAliases.get(key).getName() + "'.");}// 封装到Map中typeAliases.put(key, value);}

下面对三种方式源码进行解析

  • 第一种:type和alias属性双用(直接跳转到上面核心方法)
  public void registerAlias(String alias, String value) {registerAlias(alias, Resources.classForName(value));}
  • 第二种:仅用type属性(熟知的简单类名,为什么是简单类名当作别名下面的代码很好的体现出来了,还有一种设置别名的方式是使用@Alias注解,但小编本人不喜欢用)
  public void registerAlias(Class<?> type) {// 获取类中的简单类名称,充当别名String alias = type.getSimpleName();// 如果在对应类上用了@Alias注解的话,那对应的是@Alias注解中的value属性值// 但小编不建议用,出错了感觉不好排查Alias aliasAnnotation = type.getAnnotation(Alias.class);if (aliasAnnotation != null) {alias = aliasAnnotation.value();}// 进行封装registerAlias(alias, type);}
  • 第三种:使用package标签(常用)
  public void registerAliases(String packageName) {registerAliases(packageName, Object.class);}public void registerAliases(String packageName, Class<?> superType) {ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<>();// 获取包下的类Class对象,仅该目录下的,子目录下的类对象不包括resolverUtil.find(new ResolverUtil.IsA(superType), packageName);Set<Class<? extends Class<?>>> typeSet = resolverUtil.getClasses();for (Class<?> type : typeSet) {// 对应的类不能是匿名类/接口if (!type.isAnonymousClass() && !type.isInterface() && !type.isMemberClass()) {// 本质是使用第二种方式registerAlias(type);}}}

校验过程

通过阅读下面源码可以知道:

  1. 为什么使用别名的时候各个字符不区分大小写;
  2. 为什么使用别名也行,使用全限定类名也行。
  public <T> Class<T> resolveAlias(String string) {try {// 判断传来的别名(也可能是全限定类名)不为空if (string == null) {return null;}// 解析的时候都会转换成小写// 这就是为什么使用别名的时候别名字母小写大写无所谓String key = string.toLowerCase(Locale.ENGLISH);Class<T> value;if (typeAliases.containsKey(key)) {// 通过别名查找对应的value(Class对象)value = (Class<T>) typeAliases.get(key);} else {// 无别名就当作全限定类名处理,不存在就会抛出下面的异常value = (Class<T>) Resources.classForName(string);}// 返回结果Class对象return value;} catch (ClassNotFoundException e) {throw new TypeException("Could not resolve type alias '" + string + "'.  Cause: " + e, e);}}

Mybatis默认的别名配置

Mybatis 在初始化Configuration对象的时候自身配置了一些Java类型的类型别名。如下所示:

这是Configuration类中TypeAliasRegistry成员初始化创建对象时候进行的配置

// TypeAliasRegistry类构造器初始化public TypeAliasRegistry() {registerAlias("string", String.class);registerAlias("byte", Byte.class);registerAlias("char", Character.class);registerAlias("character", Character.class);registerAlias("long", Long.class);registerAlias("short", Short.class);registerAlias("int", Integer.class);registerAlias("integer", Integer.class);registerAlias("double", Double.class);registerAlias("float", Float.class);registerAlias("boolean", Boolean.class);registerAlias("byte[]", Byte[].class);registerAlias("char[]", Character[].class);registerAlias("character[]", Character[].class);registerAlias("long[]", Long[].class);registerAlias("short[]", Short[].class);registerAlias("int[]", Integer[].class);registerAlias("integer[]", Integer[].class);registerAlias("double[]", Double[].class);registerAlias("float[]", Float[].class);registerAlias("boolean[]", Boolean[].class);registerAlias("_byte", byte.class);registerAlias("_char", char.class);registerAlias("_character", char.class);registerAlias("_long", long.class);registerAlias("_short", short.class);registerAlias("_int", int.class);registerAlias("_integer", int.class);registerAlias("_double", double.class);registerAlias("_float", float.class);registerAlias("_boolean", boolean.class);registerAlias("_byte[]", byte[].class);registerAlias("_char[]", char[].class);registerAlias("_character[]", char[].class);registerAlias("_long[]", long[].class);registerAlias("_short[]", short[].class);registerAlias("_int[]", int[].class);registerAlias("_integer[]", int[].class);registerAlias("_double[]", double[].class);registerAlias("_float[]", float[].class);registerAlias("_boolean[]", boolean[].class);registerAlias("date", Date.class);registerAlias("decimal", BigDecimal.class);registerAlias("bigdecimal", BigDecimal.class);registerAlias("biginteger", BigInteger.class);registerAlias("object", Object.class);registerAlias("date[]", Date[].class);registerAlias("decimal[]", BigDecimal[].class);registerAlias("bigdecimal[]", BigDecimal[].class);registerAlias("biginteger[]", BigInteger[].class);registerAlias("object[]", Object[].class);registerAlias("map", Map.class);registerAlias("hashmap", HashMap.class);registerAlias("list", List.class);registerAlias("arraylist", ArrayList.class);registerAlias("collection", Collection.class);registerAlias("iterator", Iterator.class);registerAlias("ResultSet", ResultSet.class);}

这是Configuration对象创建时候的别名配置

  public Configuration() {typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);typeAliasRegistry.registerAlias("FIFO", FifoCache.class);typeAliasRegistry.registerAlias("LRU", LruCache.class);typeAliasRegistry.registerAlias("SOFT", SoftCache.class);typeAliasRegistry.registerAlias("WEAK", WeakCache.class);typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);}

这些都是Mybatis框架会配置好的,你可以直接使用。

四、总结

TypeAliasRegistry 类完成的别名机制,总的来说源码还是比较简单的,一个Map对象封装起来的就完成了。解析核心配置文件扩大别名使用,有懒就偷。

http://www.tj-hxxt.cn/news/72636.html

相关文章:

  • 建设网站的工作总结排名优化方案
  • 奶茶加盟 网站建设外包公司
  • 外贸必看网站腾讯控股第三季度营收1401亿
  • 搜索引擎网站提交入口电商网站建设公司哪家好
  • 网站建设有前途第三方网站流量统计
  • 做app网站的软件叫什么百度指数需求图谱
  • 手机网站建设czyzj友情链接平台赚钱吗
  • 网站营销是什么意思自助建站平台
  • 苏州公司网站建设标题优化方法
  • 湖南湘冠网络科技有限公司需要优化的网站有哪些
  • 用java做的游戏下载网站有哪些网站的推广平台有哪些
  • 晋城市住建设局网站网站内容检测
  • 网站和二级目录权重关键词排名
  • 网站备案转入云南网络推广公司排名
  • 重庆电商网站制作网站的平台
  • 四川省人民政府网站官网重庆做seo外包的
  • 做网站需要投资多少钱外链论坛
  • 淄博网站优化价格网站推广优化的原因
  • jsp电商网站怎么做搜索引擎优化英文简称
  • 网站头部导航样式百度快照替代
  • 一站式装修的利弊宽带业务如何推广
  • 做网站的顺序cms网站
  • 湛江网站制作优化经典广告
  • 成都网站建设前十浏览器打开网站
  • 可以做网站百度人工服务24小时电话
  • 个人网站能百度推广吗seo怎么做推广
  • 隆昌移动网站建设网络营销推广的概念
  • 中国手机网站大全域名交易
  • 班级同学录网站建设提高工作效率的软件
  • 零基础网页设计培训机构大连seo