文档章节

spring EL 和资源调用

C
 Canaan_
发布于 08/16 00:49
字数 790
阅读 4
收藏 0

资源调用

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;

@PropertySource("classpath:xxx.properties")
public class Test {


    @Value("aaa")
    private String a;

    @Value("#{systemProperties['os.name']}")         //系统属性
    private String b;

    @Value("#{T(java.lang.Math).random()*110.0}")   //表达式
    private double c;

    @Value("#{bean.aa}")                          //bean属性
    private String d;

    @Value("classpath:xxx")
    private Resource e;

    @Value("http://xxx")
    private Resource f;

    @Value("${xx.xx}")                           //配置文件
    private String g;


}

 

spring EL

 

public static void main(String[] args) {
    //ExpressionParser    :该接口的实例负责解析一个SpEL表达式,返回一个Expression对象。
    //Expression          :该接口的实例代表一个表达式
    //EvaluationContext   :代表计算表达式值的上下。当SpEL表达式中有变量时,程序需要使用该API来计算表达式值。

    //Expression#getValue() Object
    //Expression#getValue(T) T

    //Expression#getValue(EvaluationContext) Object
    //Expression#getValue(EvaluationContext,T) T

    //Expression#getValue(Object rootObject)  Object
    //Expression#getValue(Object rootObject,T)  T

    ExpressionParser parser = new SpelExpressionParser();
    //例1: 字符串表达式  <->  "hello"
    Expression expression = parser.parseExpression("'hello'");
    System.out.println(expression.getValue());  //hello


    //例2: 方法表达式 <->  "hello".concat("!")
    expression = parser.parseExpression("'hello'.concat('!')");
    System.out.println(expression.getValue());  //hello!

    //例3: getter表示式  <-> "hello".getBytes()
    expression = parser.parseExpression("'hello'.bytes");
    System.out.println(expression.getValue());  //[B@3327bd23

    //例4:对象属性  <->   "hello".getBytes().length
    expression = parser.parseExpression("'hello'.bytes.length");
    System.out.println(expression.getValue());  //5

    //例5:创建对象 <->   new String("sdf");
    expression = parser.parseExpression("new String('hello')");
    System.out.println(expression.getValue());  //hello

    User user = new User("张三");

    //例6:以指定对象作为root来计算值  <->  user.getName()
    expression = parser.parseExpression("name");
    System.out.println(expression.getValue(user));  //张三


    StandardEvaluationContext context = new StandardEvaluationContext();

    //例7:以指定context来计算值 <-> user.getName().equals("张三")
    context.setRootObject(user);
    expression = parser.parseExpression("name=='张三'");
    System.out.println(expression.getValue(context));  //true


    //例8:context 其他参数 <-> list.get(0)
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    context.setVariable("list", list);
    expression = parser.parseExpression("#list[0]");        //a
    System.out.println(expression.getValue(context));

    //例9:修改变量值
    parser.parseExpression("#list[0]").setValue(context, "ee");
    System.out.println(list);       // [ee, b, c]


    //---------------语法----------------
    parser.parseExpression("'hello'");  //字符串
    parser.parseExpression("0.23");     //浮点数
    parser.parseExpression("new String[]{'a','b','c'}");  //数组


    parser.parseExpression("{'a','b','c'}");        //list

    parser.parseExpression("{{'a','b','c'},{'d','e'}}");    //二维集合

    //list[index]       集合访问

    //map[key]           map访问

    //list[0]='a'       对集合的第一个元素进行赋值
    
    



        //类运算符 T
        parser.parseExpression("T(java.lang.Math).random()");
        //T()运算符使用java.lang包下的类时可以省略包名

        //调用构造器
        parser.parseExpression("new String('hello')");

        //变量,SpEL使用 EvaluationContext 来使用变量,可以使用 #name来访问变量名
        parser.parseExpression("#user.name");
        parser.parseExpression("#this");    //引用SpEL当前正在计算的对象
        parser.parseExpression("#root");    //引用SpEL的EvaluationContext root对象

        //自定义函数
        //通过 StandardEvaluationContext 的如下方法即可在 SpEL 中注册自定义的函数
        //context.registerFunction(name,method);

        //Elvis 运算符
        // name!=null ? name: "newVal"
        // name?:"newVal"

        //安全导航操作
        //user?.name 如果user 为 null,不会报错
        parser.parseExpression("#user?.name");


        //集合选择 collections.?[条件]
        list = new ArrayList<>();
        list.add("aa");
        list.add("bbb");
        list.add("cccc");
        Map<String, Integer> map = new HashMap<>();
        map.put("aa", 1);
        map.put("bbb", 2);
        map.put("cccc", 3);
        context.setVariable("list", list);
        context.setVariable("map", map);

        //判断集合元素 length() 方法长度在于 7 :cccc 将被移除
        parser.parseExpression("#list.?[length()>3]");

        //判断map 的 value 值大于 2 : 只剩 ccc
        parser.parseExpression("#map.?[value>2]"); //也可以调用 key

        //集合投影 collections.![条件]

        //得到的新集合的元素是原集合的每个元素length()方法返回值
        parser.parseExpression("list.![length()]");

        List<User> users = new ArrayList<>();
        users.add(new User("张三"));
        users.add(new User("李四"));
        context.setVariable("users", users);

        parser.parseExpression("users.![name]");


        //表达式模板 ,需要使用 TemplateParserContext 对象
        expression = parser.parseExpression("用户名是#{name}", new TemplateParserContext());
        System.out.println(expression.getValue(new User("张三")));    //用户名是张三


}

static class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Joda-Time
下一篇: SpringBoot2.0 停机
C
粉丝 17
博文 300
码字总数 129943
作品 0
福州
私信 提问
Spring核心——全局事件管理

ApplicationContext是一个Context策略(见上下文与IoC),他除了提供最基础的IoC容器功能,还提供了MessageSource实现的国际化、全局事件、资源层级管理等等功能。本文将详细介绍Spring核心模...

随风溜达的向日葵
08/08
0
0
springMVC笔记系列(19)——控制器实现详解(上)

本文我们在前文基础上引入一个例子,边做边聊控制器。 我们想实现一个课程查询的功能。 首先大脑应该条件反射——如何定义MVC。 M:课程(包含章节)——Course(包含Chapter) V:课程页面—...

HappyBKs
2016/06/19
437
1
JSP自定义标签扩展----支持EL,访问Spring容器

一、使JSP自定义标签支持EL表达式(${}) 我写了自定义标签a:rim,想让他的title属性支持${},可是出现了异常. 要做下面两件事就可以达到目的了: 1 在tld文件如下配置: 其中关键的是 <rtexprval...

lee123lee
2013/09/28
0
0
SpringMVC框架总结

SpringMVC流程图 ![18EEFA$]TNPMH7OA1Y}0A(1.png](http://upload-images.jianshu.io/upload_images/3722442-53321c79db972e77.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 这这......

Miss_差不多
2017/12/16
0
0
Spring依赖注入:在spring配置文件中使用properties配置文件

spring的配置文件相对是固定的,通常作为资源文件存在,而程序中经常会有一些需要配置的变量,比如数据库的连接信息,memcached的地址信息等等,这些信息最好单独放在java的配置文件propert...

yuanyuan_186
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java.util.concurrent.atomic.AtomicLong 源码

类图: 源码: package java.util.concurrent.atomic;import java.util.function.LongUnaryOperator;import java.util.function.LongBinaryOperator;import sun.misc.Unsafe;......

狼王黄师傅
13分钟前
1
0
Java每天10道面试题,跟我走,offer有!(六)

51.HashMap的实现原理 HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。HashMap基于hashing原理,我们通过put()和get()方法储...

Java干货分享
19分钟前
1
0
剧调查黑客偏爱用 Python,可能是世界上最好的语言

导读 Python 变得越来越流行,在之前 9 月份的 TIOBE 排行榜中,Python 甚至挤下 C++,拿到第三名。而这有一部分原因应当归于黑客对 Python 的热衷。 据 Threatpost 报导,在 Imperva 最近一...

问题终结者
24分钟前
1
0
apollo生产环境配置-实践笔记(附搭建框架图)

前言 我们这个月上线了apollo1.1.1版本(生产环境),目前一切运行良好,故在此记个笔记。 首先,附上流程图: 简要介绍 一套apollo portal配置管理服务来同时管理pro、dev环境,但pro、dev...

开源小菜鸟2333
26分钟前
3
0
angular6 利用 ngContentOutlet 实现组件位置交换

这篇文章主要介绍了angular6 利用 ngContentOutlet 实现组件位置交换(重排),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ngContentOutlet指令介绍 ngCont...

嫣然丫丫丫
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部