• 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

  • 相关阅读:
    随笔:我为什么要写博客?
    用纯C语言写的一个植物大战僵尸的外挂
    方法:如何获取操作系统所有分区(逻辑驱动器)
    Srping syntactically incorrect.错误记录
    重建项目报错
    easyui datagrid 跨页选择
    CentOS 6编译安装ipvsadm和keepalived
    CentOS 6下ActiveMQ 5.5安装及使用MySQL
    extjs 4中TreePanel和GridPanel使用
    Linux安装性能问题
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/7089510.html
Copyright © 2020-2023  润新知