SpEL表达式

Posted zumengjie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpEL表达式相关的知识,希望对你有一定的参考价值。

春节在家躲避流感,闲来无事看看spring文档打发时间。总结了spring中SpEL表达式的各种骚写法,其实还有几个,确实看不明白怎么用。代码片段环境为springboot,建议将代码复制到项目里运行能看出效果哦。

技术图片
package com.datang.springcode.el;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-01-22 22:19
 * @notify
 * @version 1.0
 */

import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class Bean1 {

    public String name = "张三";
    public List<String> hobby = new ArrayList<>();
    public String[] honey = {"小红", "小兰"};
    public Map<String,Integer> grade = new HashMap<>();
    public String nullN = null;
    public List<Bean2> bean2s=new ArrayList<>();

    public Bean1() {
        hobby.add("篮球");
        hobby.add("足球");
        hobby.add("乒乓球");
        grade.put("语文",100);
        grade.put("数学",99);
        bean2s.add(new Bean2("张三"));
        bean2s.add(new Bean2("莉莉丝"));
        bean2s.add(new Bean2("汪汪五"));
    }

    public int getAge(){
        return 100;
    }
}
View Code
技术图片
package com.datang.springcode.el;/*
* @auther 顶风少年 
* @mail dfsn19970313@foxmail.com
* @date 2020-01-23 15:27
* @notify 
* @version 1.0
*/
public class Bean2 {
    public String name;

    public Bean2(String name) {
        this.name = name;
    }
}
View Code
技术图片
package com.datang.springcode.el;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-01-22 21:40
 * @notify
 * @version 1.0
 */

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;

@Component
public class ElBean {
    //注入Boolean
    @Value("true")
    private boolean booleanType;

    //注入short
    @Value("123")
    private Short shortType;

    //注入double
    @Value("12.33")
    private Double doubleType;

    //注入字符串
    @Value("ddd")
    private String stringType;

    /*
    取的bean的属性,该bean的属性必须是public或者有get()方法。
    */

    //也可以注入bean
    @Value("#{@bean1}")
    private Bean1 bean2;

    //取bean的属性
    @Value("#{bean1.name}")
    private String name;

    //bean的属性是数组
    @Value("#{bean1.honey[0]}")
    private String honey;

    //bean的属性是集合
    @Value("#{bean1.hobby[1]}")
    private String hobby;

    //bean的属性是map,根据key取value
    @Value("#{bean1.grade[‘数学‘]}")
    private int grade;

    //创建数组
    @Value("#{new int[]{1,2,3}}")
    private int[] phoneCode;

    //调用bean的方法
    @Value("#{bean1.getAge()}")
    private int age;

    //关系运算符 等于,不等于,小于,小于或等于,大于和大于或等于
    @Value("#{1==1}")
    private boolean booleanType2;

    //逻辑运算符 && || !
    @Value("#{ !true }")
    private boolean booleanType3;

    //算数运算符 + - * / % ^
    @Value("#{2^2}")
    private int intType1;

    //new 对象,注意必须是全限定类名
    @Value("#{new com.datang.springcode.el.Bean1()}")
    private Bean1 bean1;

    //三元表达式
    @Value("#{bean1.getAge()>2?bean1.getAge():2}")
    private Integer intType2;

    //判断属性是否为null的三元表达式可以简化,但是如果该属性不存在报错。
    @Value("#{bean1.nullN?:‘张三三‘}")
    private String intType3;

    //对map的value筛选
    @Value("#{bean1.grade.?[value>99]}")
    private Map<String,String> map;

    //bean的集合中是一个对象,取每个对象的属性
    @Value("#{bean1.bean2s.![name]}")
    private List<String> names;


}
View Code
技术图片
 @Test
    public void t4(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringcodeApplication.class);
        ElBean bean = applicationContext.getBean(ElBean.class);
        System.out.println(bean);
    }
View Code

新年快乐!

以上是关于SpEL表达式的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 和 Spring Security - 自定义 SpEL 表达式

SpEl及@Value的SpEl表达式源码分析

SpEl及@Value的SpEl表达式源码分析

SpEl及@Value的SpEl表达式源码分析

SpEl及@Value的SpEl表达式源码分析

Spring系列.SpEL表达式