zoukankan      html  css  js  c++  java
  • SpEL、PropertyPlaceholderConfigurer与@Value、#{}、${}

    概念

    SpEL:Spring EL表达式

    PropertyPlaceholderConfigurer:即org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.java。我们通常通过配置一个PropertyPlaceholderConfigurer类型的bean,来将properties文件交给Spring来托管。

    @Value、#{}、${}:通过@Value、#{}、${},可以读取受Spring托管的配置。(被托管的配置可能是properties文件、常量类的bean)

    一、Spring EL表达式

    EL表达式三个概念:

    • 1. expression(表达式)
    • 2. context(上下文)
    • 3. root object(根对象)

    Expression是从指定的上下文中获取相应的内容。
    也就是说,Expression指定了要获取的property name,但还需要指定从什么地方获取该property value。
    EL中可以从上下文context和root object中获取property value。

    org.springframework.expression.Expression中提供了很多取property value的方法,如下几个比较重要:
    从default standard context中获取property value

    /**
     * Evaluate this expression in the default standard context.
     * @return the evaluation result
     * @throws EvaluationException if there is a problem during evaluation
     */
    Object getValue() throws EvaluationException;
    

    从指定的context中获取property value

    /**
     * Evaluate this expression in the provided context and return the result of evaluation.
     * @param context the context in which to evaluate the expression
     * @return the evaluation result
     * @throws EvaluationException if there is a problem during evaluation
     */
    Object getValue(EvaluationContext context) throws EvaluationException;
    

    从指定的root object中获取property value

    /**
     * Evaluate this expression against the specified root object
     * @param rootObject the root object against which properties/etc will be resolved
     * @return the evaluation result
     * @throws EvaluationException if there is a problem during evaluation
     */
    Object getValue(Object rootObject) throws EvaluationException;
    

    EL表达式的功能

    英文中文
    Literal expressions 字面值表达式
    Boolean and relational operators 布尔和关系操作符
    Regular expressions 正则表达式
    Class expressions 类表达式
    Accessing properties, arrays, lists, maps 访问properties、arrays、lists、maps
    Method invocation 方法调用
    Relational operators 关系操作符
    Assignment 赋值
    Calling constructors 调用构造器
    Bean references bean引用
    Array construction 构建数组
    Inline lists 内联lists
    Inline maps 内联maps
    Ternary operator 三元操作符
    Variables 变量
    User defined functions 用户定义的功能
    Collection projection 集合投影
    Collection selection 集合选择
    Templated expressions 模板化表达式

    参考:
    [1]http://www.cnblogs.com/larryzeal/p/5964621.html
    [2]http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#expressions

    二、 @Value、#{}、${}

    http://www.cnblogs.com/larryzeal/p/5910149.html

    Spring的属性注入,都依赖属性文件是受Spring容器管理的。
    可以这么说,想要使用Spring的功能,那么,你的资源(实体、类、资源文件等)都必需受Spring容器的管理。当然,properties文件也不例外。

    Spring对#{}和${}的支持,是通过org.springframework.expression.common.TemplateAwareExpressionParser来实现的。

    public Expression parseExpression(String expressionString, ParserContext context)
            throws ParseException {
        if (context == null) {
            context = NON_TEMPLATE_PARSER_CONTEXT;
        }
        if (context.isTemplate()) { // 按${}来处理
            return parseTemplate(expressionString, context);
        }
        else { // 按#{}来处理,即使用EL表达式来处理
            return doParseExpression(expressionString, context);
        }
    }
    

     EL对应的解析器:StandardBeanExpressionResolver

    要将配置文件给Spring管理的话,一般会使用如下配置:

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/props/jdbc.properties</value>
            </list>
        </property>
    </bean>
    

    这样我们就能在Spring环境下来使用它了。

    @Value

    @Value的值有两类:

    • ① ${ property : default_value }
    • ② #{ obj.property? : default_value }
      就是说,第一个注入的是参数对应的property,第二个则是SpEL表达式对应的内容。 那个 default_value,就是前面的值为空时的默认值。注意二者的不同。

    ${key}

    取properties文件中key对应的value。本质上是取PropertyPlaceholderConfigurer这个bean中的key对应的value。

    #{object.field}

    #是SpEl表达式,它取的是对象的属性。注意,这个对象object必需是Spring的Bean。

    #{'${key}'}

    $与#可以结合起来一起使用。可以参看例子:com.cn.kvn.framework.property_test.spel.SpelDomain.java

  • 相关阅读:
    互联网改变的产业 汽车 x 互联网 = 汽车革命
    我有一个实现HMI触摸屏的资源【4418开发平台】降d成本
    iTOP-4412开发板裸机开发环境文档分享
    2019年最受欢迎iTOP-4418开发板_新产品研发必备利器
    安卓触控一体机为什么得到大家认可?远比Windows系统一体机大受欢迎
    新手入门嵌入式学习单片机?stm32?树莓派?4412开发板资料大汇报-基础了解
    iTOP-4418开发板-Qt系统下运行摄像头测试程序
    iTOP-4418/6818开发板-QtE4.7WIFI_MT6620热点
    iTOP-4412开发板-使用PartitionManager分区之后tf卡无法识别
    迅为iTOP-4418/6818开发板-MiniLinux-GPS使用文档
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/7089510.html
Copyright © 2011-2022 走看看