spring表达式SpringEL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jasnet_u/article/details/82119679

注意Spring表达式使用的是#{"xxx"},而不是${"xxx"}。${"xxx"}主要用来解析properties、yml文件的,而spring表达式#{"xxx"}是用来解析bean的,二者请勿混淆。本篇,我们介绍的是spring表达式,也就是 #{"xxx"}  。 

SpringEL是spring3里面的东东,不是spring4,也不是springboot,更不是springcloud中的东东。

参考文章 :

https://www.cnblogs.com/best/p/5748105.html

https://blog.csdn.net/zhoucheng05_13/article/details/54603985

Spring3引入了Spring表达式语言(Spring Expression Language,SpEL),它能够以一种强大和简介的方式将值装配到bean属性和构造器参数中。SpEL拥有很多特性,包括:
a、使用bean的ID来引用bean;
b、调用方法和访问对象的属性;
c、对值进行算数、关系和逻辑运算;
d、正则表达式匹配;
e、集合操作。

等。。。

废话不多讲了,我们来直接看个例子。

一个Person 实体类、一个UserBean  bean 。 

Person.java

package com.tingcream.springdemo.model;
 
public class Person {
   
    private String name;
    private int age;
     
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
 
     
}

UserBean.java 

package com.tingcream.springdemo.model;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.stereotype.Component;
 
@Component
public class UserBean {
   
    private String name="张三";
     
    private  List<String> hobbies=
        Arrays.asList(new String[] {"basketball","volleyball","football"});
     
     
    private int   grade=80;
    private List<Person> persons;
     
     
    private Map<String,Object>  map ;
    {
        map=new HashMap<String,Object>();
        map.put("aa", "hello world");
        map.put("bb", 110);
         
        persons=new ArrayList<Person>();
         
        persons.add(new Person("张三",23));
        persons.add(new Person("李四",24));
        persons.add(new Person("王五",25));
        persons.add(new Person("陈六",26));
        persons.add(new Person("田七",27));
        persons.add(new Person("胡八",28));
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public List<String> getHobbies() {
        return hobbies;
    }
 
    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }
 
  
 
    public Map<String, Object> getMap() {
        return map;
    }
 
    public int getGrade() {
        return grade;
    }
 
    public void setGrade(int grade) {
        this.grade = grade;
    }
 
    public void setMap(Map<String, Object> map) {
        this.map = map;
    }
 
    public List<Person> getPersons() {
        return persons;
    }
 
    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }
 
    @Override
    public String toString() {
        return "UserBean [name=" + name + ", hobbies=" + hobbies + ", grade=" + grade + ", persons=" + persons
                + ", map=" + map + "]";
    }
 
}

SpringStartupListener.java  

package com.tingcream.springdemo.common;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import com.tingcream.springdemo.model.Person;
import com.tingcream.springdemo.model.UserBean;
 
@Component
public class SpringStartupListener implements ApplicationListener<ContextRefreshedEvent> {
     
     
    @Value("#{userBean.getName()}")//springEL调用bean的方法,使用#{userBean.name}亦可
    private String name;
     
    @Value("#{userBean.hobbies}")//springEL注入bean的集合属性,可用List或数组接收
    private List<String> hobbies;
     
    @Value("#{userBean}")//直接注入整个bean对象,相当于@AutoWired注入一个bean
    private UserBean userBean;
     
    @Value("#{userBean.hobbies[0]}")//注入bean的部分属性、索引
    private String hobby0;
     
    //正则   matchs
    @Value("#{'asdf' matches '[a-zA-Z0-9]{1,20}'}")//springEL中还可以使用正则表达式
    private boolean  f;
     
    @Value("#{userBean.map['aa']}")
    private  String aa ;
     
    @Value("#{userBean.map['bb']}")
    private  String bb ;
      
    @Value("#{userBean.grade + 10}") //springEL中还可以进行算术运算
    private  int   grade2;
 
      
    @Value("#{userBean.hobbies[T(java.lang.Math).random()*userBean.hobbies.size()]}") //springEL中还可以调用类的静态方法,或bean的方法
    private String hobby;
     
      
    //筛选子集合
    //  #{persons.?[age gt 20]}
    //  gt  lt  eq  == > <   >= <=  
    //  .?[age > 25]  筛选出age大于25的所有person
    //  .^[age > 25]  筛选出age大于25的第一个person
    //  .$[age > 25]  筛选出age大于25的最后一个person
    @Value("#{userBean.persons.?[age >= 25]}")
    private  List<Person> personList1;
     
     
    //投影  persons.![name + ', ' + age]
    @Value("#{userBean.persons.![name]}")
    private List<String> personNames;
     
    @Value("#{userBean.persons.![name+','+age]}")
    private List<String> nameAges;
      
     
     
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
       System.out.println("======== SpringStartupListener初始化============");
       System.out.println(name);
       System.out.println(hobbies);
       System.out.println(userBean);
        
       System.out.println("是否匹配:"+f);
       System.out.println("hobby0:"+hobby0);
       System.out.println("aa:"+aa);
       System.out.println("bb:"+bb);
       System.out.println("grade2:"+grade2);
       System.out.println("hobby:"+hobby);
        
       System.out.println("================");
       System.out.println("personList1:");
       for( Person p: personList1 ) {
           System.out.println(p);
       }
       System.out.println("================");
       System.out.println("personNames:");
       for( String s: personNames ) {
           System.out.println(s);
       }
       System.out.println("================");
       System.out.println("nameAges:");
       for( String a: nameAges ) {
           System.out.println(a);
       }
       
    }
      
}

 启动springboot应用,观察控制台输出 :

======== SpringStartupListener初始化============
张三
[basketball, volleyball, football]
UserBean [name=张三, hobbies=[basketball, volleyball, football], grade=80, persons=[Person [name=张三, age=23], Person [name=李四, age=24], Person [name=王五, age=25], Person [name=陈六, age=26], Person [name=田七, age=27], Person [name=胡八, age=28]], map={aa=hello world, bb=110}]
是否匹配:true
hobby0:basketball
aa:hello world
bb:110
grade2:90
hobby:basketball
================
personList1:
Person [name=王五, age=25]
Person [name=陈六, age=26]
Person [name=田七, age=27]
Person [name=胡八, age=28]
================
personNames:
张三
李四
王五
陈六
田七
胡八
================
nameAges:
张三,23
李四,24
王五,25
陈六,26
田七,27
胡八,28

ok~~

猜你喜欢

转载自blog.csdn.net/jasnet_u/article/details/82119679