• 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的初始化和属性获取后进行属性填充的时候。

  • 相关阅读:
    Selenium
    Selenium和ChromeDriver下载地址
    CQRS Event Sourcing介绍
    JAVA程序员面试30问(附带答案)
    拼多多、饿了么、蚂蚁金服Java面试题大集合
    40K刚面完Java岗,这些技术必须掌握
    接口测试之深入理解HTTPS
    选择了软件测试,你后悔吗?
    如何优雅的使用 Python 实现文件递归遍历
    刚从阿里回来,有些想法想跟测试员说说
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/6072652.html
Copyright © 2020-2023  润新知