zoukankan      html  css  js  c++  java
  • SPEL语言-Spring Expression Language

    Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts 2x中使用的OGNL表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等,并且能与Spring功能完美整合,比如能用来配置bean定义。SpEL是单独模块,只依赖于core模块,不依赖于其他模块,可以单独使用

    SpEL使用#{…}作为定界符,所有在大框号中的字符都将被认为是SpEL,使用格式如下:

    <util:properties id="db" location="classpath:db.properties">  
    </util:properties>  
    <bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">  
      <property name="username" value="#{db.user}"></property>  
      <property name="password" value="#{db.pwd}"></property>  
      <property name="driverClassName" value="#{db.driver}"></property>  
      <property name="url" value="#{db.url}"></property>  
    </bean>  

    在源码中通过代码prepareBeanFactory-->beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver())注册语言解析器,就可以对SPEL进行解析了,那么在注册解析器后Spring又是在什么时候调用这个解析器进行解析呢?

    Spring在bean进行初始化的时候会有属性填充的一步,而在这一步中Spring会调用AbstractAutowireCapableBeanFactory类的applyPropertyValues函数来完成功能。就在这个函数中,会通过构造BeanDefinitionValueResolver类型实例valueResolver来进行属性值的解析。同时,也是在这个步骤中一般通过AbstractBeanFactory中的evaluateBeanDefinitionString方法去完成SPEL的解析。

    protected Object evaluateBeanDefinitionString(String value, BeanDefinition beanDefinition) {  
        if (this.beanExpressionResolver == null) {  
            return value;  
        }  
        Scope scope = (beanDefinition != null ? getRegisteredScope(beanDefinition.getScope()) : null);  
        return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));  
    }  

    当调用这个方法时会判断是否存在语言解析器,如果存在则调用语言解析器的方法进行解析,解析的过程是在Spring的expression的包内我们通过查看对evaluateBeanDefinitionString方法的调用层次可以看出,应用语言解析器的调用主要是在解析依赖注入bean的时候,以及在完成bean的初始化和属性获取后进行属性填充的时候。

  • 相关阅读:
    实现货币金额中文大写转换的程序
    大数阶乘的计算(三)
    全国15亿人口中选1000个代表有多少种选法?
    DB Query Analyzer 中断SQL语句的执行
    Android_Preference存取数据
    Centos 学习笔记软件包管理
    Centos学习笔记文件搜索命令
    《计算机时代》2011年第12期刊登出《DB Query Analyzer中断SQL语句的执行》
    Centos学习笔记linux用户管理
    Centos学习笔记 linux 常用命令:压缩解压命令
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/6072652.html
Copyright © 2011-2022 走看看