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

网络科技建设网站杭州排名推广

网络科技建设网站,杭州排名推广,b2b网站建设规则,无锡住房和城乡建设局网站核心配置中${}表达式配置的解析一、核心配置主体二、核心配置文件中properties是如何被解析的?三、${} 表达式的解析四、总结前提: 核心配置文件是被XMLConfigBuilder 对象进行解析的,configuration 对象是由它父类BaseBuider继承下来的属性…

核心配置中${}表达式配置的解析

  • 一、核心配置主体
  • 二、核心配置文件中properties是如何被解析的?
  • 三、${} 表达式的解析
  • 四、总结

前提:

核心配置文件是被XMLConfigBuilder 对象进行解析的,configuration 对象是由它父类BaseBuider继承下来的属性。
XMLConfigBuilder 对象解析完配置文件,其信息是被封装在了configuration 对象中,
然后返回,通过SqlSessionFactoryBuilder 去通过build(configuration)方法进行构建SqlSessionFactory对象,
一个数据库是关联一个environment 的,所以是一个sqlSessionFactory 对象对应一个数据库,实际上也对应一个configuration 对象........

一、核心配置主体

配置信息的配置主体先进行阐明:

public Configuration parse() {  if (parsed) {  throw new BuilderException("Each XMLConfigBuilder can only be used once.");  }  parsed = true;  //源码中没有这一句,只有 parseConfiguration(parser.evalNode("/configuration"));  //为了让读者看得更明晰,源码拆分为以下两句  XNode configurationNode = parser.evalNode("/configuration");  parseConfiguration(configurationNode);  return configuration;  
}  
/** * 解析 "/configuration"节点下的子节点信息,然后将解析的结果设置到Configuration对象中 */  
private void parseConfiguration(XNode root) {  try {  //1.首先处理properties 节点     propertiesElement(root.evalNode("properties")); //issue #117 read properties first  //2.处理typeAliases  typeAliasesElement(root.evalNode("typeAliases"));  //3.处理插件  pluginElement(root.evalNode("plugins"));  //4.处理objectFactory  objectFactoryElement(root.evalNode("objectFactory"));  //5.objectWrapperFactory  objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));  //6.settings  settingsElement(root.evalNode("settings"));  //7.处理environments  environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631  //8.database  databaseIdProviderElement(root.evalNode("databaseIdProvider"));  //9.typeHandlers  typeHandlerElement(root.evalNode("typeHandlers"));  //10.mappers  mapperElement(root.evalNode("mappers"));  } catch (Exception e) {  throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);  }  
} 

再看核心配置文件中DTD约束,不难看出其解析顺序和约束是一致的。这些解析出来的结果最后都会封装到configuration对象中。

二、核心配置文件中properties是如何被解析的?

properties的三种配置方式:

  1. 通过property 子标签,进行name<==>value进行配置;
  2. 通过url 属性(外配置文件);
  3. 通过resource 属性(外配置文件)。为契合项目路径,这种方式使用的多。

下面阅读已被吾注解好了的解析properties 的代码

  private void propertiesElement(XNode context) throws Exception {if (context != null) {// 第一种配置方式Properties defaults = context.getChildrenAsProperties();// 第三种利用resource配置String resource = context.getStringAttribute("resource");// 第二种利用url进行配置String url = context.getStringAttribute("url");// 第二种和第三种配置不能同时存在// 意思就是resource 属性和 url 属性不能同时存在。// 如果同时存在的话就抛异常if (resource != null && url != null) {throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");}// 下面就是分别对resource和url进行判断了if (resource != null) {defaults.putAll(Resources.getResourceAsProperties(resource));} else if (url != null) {defaults.putAll(Resources.getUrlAsProperties(url));}// 这个是看原先有没有对cofiguration中的variables属性赋值// 如果有的话一并加入到defaults这个对象中Properties vars = configuration.getVariables();if (vars != null) {defaults.putAll(vars);}// parser 是一个XPathParser的对象;其中有variable是其中的一个属性// variable 是Properties 对象;// 先对parser 的variable的属性进行赋值,后面用于 对datasource 的配置有用parser.setVariables(defaults);// 解析的结果最后得在configuration中,所以....configuration.setVariables(defaults);}}

这里需要注意的有两点:

  1. SqlSessionBuilder执行build方法的时候,也是可以传一个Properties 对象的,这个对象会在XMLConfigBuilder对象创建的时候赋值给configuration对象,这也就是上面源码那个为什么要去判断一下有没有提前赋值(上面的vars)。
  2. 这里defaults 对象虽然不允许 url 和 resource 属性值都时接受,但是允许接受完 url 或 resource的配置文件后还可以加上第一种配置产生的值,还可以接受 build 传过来的配置,非常的灵活。
  3. Configuration 对象中的set、get方法是对外提供的,当然也可以自行对其进行修改和获取。当然没啥事谁修改这玩意啊。

三、${} 表达式的解析

回到根本,${} 到底是如何解析的呢?

首先需要了解 XNode 类中的 evalNode(String expression) 方法。

在这里插入图片描述
这个 XPathParser 对象都是使用的 XMLConfigBuilder 内的属性 parser 对象。

在这里插入图片描述

variables 解析其他标签也都是共享的,一级传一级的。

所以也就是说解析 datasource 是可以使用共享的 variables 的。

然后就可以看解析的 environmentElement 了,看看。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

解析这个 '${}‘ 的核心代码如下:

/*** 这个类解析${}这种形式的表达式*/
public class PropertyParser {public static String parse(String string, Properties variables) {VariableTokenHandler handler = new VariableTokenHandler(variables);GenericTokenParser parser = new GenericTokenParser("${", "}", handler);return parser.parse(string);}private static class VariableTokenHandler implements TokenHandler {private Properties variables;public VariableTokenHandler(Properties variables) {this.variables = variables;}public String handleToken(String content) {if (variables != null && variables.containsKey(content)) {return variables.getProperty(content);}return "${" + content + "}";}}
}

四、总结

  1. 解析顺序和DTD约束是一致的;
  2. properties 配置的解析及其三种配置方式,resource和url不可以共存,但使用property子标签配置可以共存;
  3. XMLConfigBuilder 中的 XPathParser 类型对象 parser 属性,在解析过程中一直使用的是同一个,并且所解析的 variables 那个配置也一直在传递;
  4. variables 可以是properties 中所写的配置,也可以是调用SqlSessionBuilder对象中的build方法进行传入;
  5. ${content} 是通过字符串处理的方式和从 variables 查询 content 的方式进行处理的。
http://www.dinnco.com/news/47878.html

相关文章:

  • 安福网站制作seo排名培训
  • 网站 做 专家问答百度搜索量排名
  • 网站 首页 关键词种子搜索神器在线搜
  • 淮安企业网站seo百度seo排名优化软件
  • 注册做网站的公司有哪些自己如何做一个网站
  • 克拉玛依网站建设公司怎样做企业推广
  • 网站背景css河南最新消息
  • 深圳网站优化团队信息流优化师职业规划
  • 响应式网站如何做百度指数官网入口登录
  • 如何设计网站首页怎么推广一个平台
  • 两人做性视频网站114网址大全
  • 国外男女直接做的视频网站网络营销策略实施的步骤
  • 商户网站建设公司成都有实力的seo团队
  • 企业备案网站名称怎么填互联网下的网络营销
  • 成都网站建设 四川冠辰哪里可以学企业管理培训
  • 深圳市建设执业培训中心网站泉州关键词搜索排名
  • 网站后台无法修改信息北京网
  • 石狮市网络优化主要做什么
  • 开发公司 网站建设价格软件推广怎么做
  • 有哪些专门做展会创意的网站b2b多平台一键发布
  • 在线做投资网站网络销售平台怎么做
  • 凤冈建设局网站优化关键词排名
  • 网上做彩票网站排名运营商推广5g技术
  • 做网站一个月20g流量够吗百度推广河南总部
  • 做一个在线支付网站如何快速收录一个网站的信息
  • 怎么做外国网站流量企业网站建设价格
  • 做关于时尚网站的目的百度快速收录工具
  • seo服务器优化辽宁好的百度seo公司
  • 怎么建独立网站小升初最好的补课机构排行榜
  • 重庆汽车网站建设seo新手快速入门