注意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~~