博客详情

spring表达式SpringEL (原创)

作者: 朝如青丝暮成雪
发布时间:2018-08-27 21:45:15  文章分类:java编程   阅读(1229)  评论(0)

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


本篇,我们介绍的是spring表达式  #{"xxx"} 


参考文章 :

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);
       }
      
	}
	 
}


 


关键字:  springEL  spring
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号