• Spring入门第十课


    Spring表达式语言:SpEL

    Spring表达式语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言。

    语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL

    SpEL为bean的属性进行动态复制提供了便利。

    通过SpEL可以实现:

    -通过bean的id对bean进行引用

    -调用方法以及引用对象中的属性

    -计算表达式的值

    -正则表达式的匹配

    下面看如何使用

    package logan.spring.study.spel;
    
    public class Car {
        
        private String brand;
        private int price;
        
        private double tyrePerimeter;
        
        public String getBrand() {
            return brand;
        }
        public void setBrand(String brand) {
            this.brand = brand;
        }
        public int getPrice() {
            return price;
        }
        public void setPrice(int price) {
            this.price = price;
        }
        public double getTyrePerimeter() {
            return tyrePerimeter;
        }
        public void setTyrePerimeter(double tyrePerimeter) {
            this.tyrePerimeter = tyrePerimeter;
        }
        @Override
        public String toString() {
            return "Car [brand=" + brand + ", price=" + price + ", tyrePerimeter=" + tyrePerimeter + "]";
        }
    }
    package logan.spring.study.spel;
    
    public class Address {
        
        private String city;
        
        private String street;
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getStreet() {
            return street;
        }
    
        public void setStreet(String street) {
            this.street = street;
        }
    
        @Override
        public String toString() {
            return "Address [city=" + city + ", street=" + street + "]";
        }
        
        
    
    }
    package logan.spring.study.spel;
    
    public class Person {
        
        private String name;
        
        
        
        private Car car;
        
        //引用 address bean 的city属性
        private String city;
        //根据car的price确定info:car的price >=300000位金领,否则为白领
        private String info;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Car getCar() {
            return car;
        }
    
        public void setCar(Car car) {
            this.car = car;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getInfo() {
            return info;
        }
    
        public void setInfo(String info) {
            this.info = info;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", car=" + car + ", city=" + city + ", info=" + info + "]";
        }
    
        
    }

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        
        <bean id="address" class="logan.spring.study.spel.Address">
            <!-- 使用spel为属性赋一个字面值 -->
            <property name="city" value="#{'BeiJing'}"></property>
            <property name="street" value="WuDaoKou"></property>
        </bean>
        
        <bean id="car" class="logan.spring.study.spel.Car">
            <property name="brand" value="Audi"></property>
            <property name="price" value="500000"></property>
            <!-- 使用SPEL使用类的静态属性 -->
            <property name="tyrePerimeter" value="#{T(java.lang.Math).PI * 80}"></property>
        </bean>
        
        <bean id="person" class="logan.spring.study.spel.Person">
            <property name="car" value="#{car}"></property>
            <property name="city" value="#{address.city}"></property>
            <property name="info" value="#{car.price > 30 ? '金领':'白领'}"></property>
            <property name="name" value="Tom"></property>
        </bean>
    
    
    </beans>
    package logan.spring.study.spel;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-spel.xml");
            Address address = (Address) ctx.getBean("address");
            System.out.println(address);
            
            Car car = (Car) ctx.getBean("car");
            
            System.out.println(car);
            
            Person person = (Person) ctx.getBean("person");
            System.out.println(person);
    
        }
    
    }

    下面是输出结果

    五月 21, 2017 10:01:50 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
    信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7aec35a: startup date [Sun May 21 10:01:50 CST 2017]; root of context hierarchy
    五月 21, 2017 10:01:50 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [beans-spel.xml]
    Address [city=BeiJing, street=WuDaoKou]
    Car [brand=Audi, price=500000, tyrePerimeter=251.32741228718345]
    Person [name=Tom, car=Car [brand=Audi, price=500000, tyrePerimeter=251.32741228718345], city=BeiJing, info=金领]
  • 相关阅读:
    JavaScript函数柯里化的一些思考
    Javascript Promise 学习笔记
    ArcGIS加载高德、OSM和谷歌等地图
    抓取“矢量”的实时交通流量数据
    uniapp使用swiper组件做tab切换动态获取高度
    elementui中弹出框不能自动换行的解决方案
    前端面试题总结
    关于nodejs中的增删改查
    关于cookie与本地 存储的区别的问题。
    微信小程序实现如丝顺滑可移动悬浮按钮(超简单)
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6883471.html
Copyright © 2020-2023  润新知