zoukankan      html  css  js  c++  java
  • xml中${}的使用含义(美元符号大括号,以Spring、ibatis、mybatis为例)

    xml中${}的使用含义(美元符号大括号,以Spring、ibatis、mybatis为例)

     转:
    项目中,经常会在xml中看到这样的写法:
    复制代码
    <properties resource="properties/database.properties"/>
    
    <dataSource type="SIMPLE">
          <property value="${driver}" name="JDBC.Driver"/>
          <property value="${url}" name="JDBC.ConnectionURL"/>
          <property value="${username}" name="JDBC.Username"/>
          <property value="${password}" name="JDBC.Password"/>
        </dataSource>
    复制代码

    看到了${}这样的表达式,脑海里面第一印象是不是我们jsp中的EL表达式?!

    哈哈。。。

    不过,这个真不是EL表达式,Spring提供了自己的EL表达式,可是它的格式是#{}

    so....

    ${key}这样的表达式在XML中,代表引入的properties文件中key对应的一个变量值,完全是靠第三方jar自己解析的。

    ==============分割线===========

    举例:

    a.ibatis的配置文件中,${}的解析,直接上代码:

    复制代码
    public static String parsePropertyTokens(String string, Properties variables) {
        final String OPEN = "${";
        final String CLOSE = "}";
    
        String newString = string;
        if (newString != null && variables != null) {
          int start = newString.indexOf(OPEN);
          int end = newString.indexOf(CLOSE);
    
          while (start > -1 && end > start) {
            String prepend = newString.substring(0, start);
            String append = newString.substring(end + CLOSE.length());
            String propName = newString.substring(start + OPEN.length(), end);
            String propValue = variables.getProperty(propName);
            if (propValue == null) {
              newString = prepend + propName + append;
            } else {
              newString = prepend + propValue + append;
            }
            start = newString.indexOf(OPEN);
            end = newString.indexOf(CLOSE);
          }
        }
        return newString;
      }
    复制代码

    发现木有,完全就是解析字符的嘛!!!!代码参考:com.ibatis.common.xml.NodeletUtils.java

    b.spring的配置文件中,${}的解析,直接上代码

    复制代码
    /** 
         * Resolve placeholder values in the given array of patterns. 
         * @return a new array with updated patterns 
         */  
        protected String[] resolveEmbeddedValuesInPatterns(String[] patterns) {  
            if (this.embeddedValueResolver == null) {  
                return patterns;  
            }  
            else {  
                String[] resolvedPatterns = new String[patterns.length];  
                for (int i=0; i < patterns.length; i++) {  
                    resolvedPatterns[i] = this.embeddedValueResolver.resolveStringValue(patterns[i]);  
                }  
                return resolvedPatterns;  
            }  
        }  
    复制代码

    Spring的代码是不是很晦涩,有兴趣的童鞋研究PropertyPlaceholderConfigurer(而且如果它未找到${xxx}中定义的xxx键,它还会去JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找)

    总结:

    xml文件中,如果使用了${},解析的工作依靠的就是第三方jar;

  • 相关阅读:
    常用正则表达式大全
    js基础的自定义属性练习
    AngularJS中最重要的核心功能
    Architecture.the-reactive-manifesto
    iOS.ReactNative-3-about-viewmanager-uimanager-and-bridgemodule
    iOS.DistributionApp.1-mobile-provision-file[draft]
    iOS.DistributionApp.0-build-adhoc-distribution-for-tester
    iOS.ReactNative-5-make-react-native-to-support-dynamically-update
    OpenSource.organization-in-github
    iOS.Performance-trick-presentViewController-is-so-slow-in-didSelectRowAtIndexPath
  • 原文地址:https://www.cnblogs.com/keyi/p/7475763.html
Copyright © 2011-2022 走看看