zoukankan      html  css  js  c++  java
  • Spring系列.SpEL表达式

    Spring表达式语言

    SpEL语言是一种强大的表达式语言,支持在运行时查询和操作对象。SpEL表达式不一定要创建IOC容器后才能使用。用户完全可以单独调用SpEL的API来独立的使用时SpEL表达式。SpEL表达式支持如下的特性:

    • 文字表达式;
    • 布尔关系表达式;
    • 正则表达式;
    • 类表达式;
    • 获取数组和map;
    • 方法调用;
    • 赋值;
    • 应用IOC容器中的Bean;

    SpEL简单例子

        //文字表达式(Literal expressions);
        //需要特别注意的是SpEL整个表达式需要用""括起来,里面的字符串用''括起来
        ExpressionParser parser = new SpelExpressionParser();
    	Expression exp = parser.parseExpression("'Hello World'"); 
    	String message = (String) exp.getValue();
        
        //调用一个对象的方法(Method invocation)
        ExpressionParser parser = new SpelExpressionParser();
    	Expression exp = parser.parseExpression("'Hello World'.concat('!')"); 
    	String message = (String) exp.getValue();
           
        ExpressionParser parser = new SpelExpressionParser();
        //如果bytes是一个对象的public属性,则直接调用这个属性
        //否则调用对象的getBytes()这个方法
        Expression exp = parser.parseExpression("'Hello World'.bytes"); 
    	byte[] bytes = (byte[]) exp.getValue();
    
        //调用构造函数
        ExpressionParser parser = new SpelExpressionParser();
    	Expression exp = parser.parseExpression("new String('hello world').toUpperCase()"); 
    	String message = exp.getValue(String.class);
    
        //获取一个对象的属性,注意getValue时,需要将对象作为入参
        // The constructor arguments are name, birthday, and nationality.
        Inventor tesla = new Inventor("Nikola Tesla", c.getTime(), "Serbian");
        ExpressionParser parser = new SpelExpressionParser();
    	Expression exp = parser.parseExpression("name"); 
    	String name = (String) exp.getValue(tesla);
    	// name == "Nikola Tesla"
    	exp = parser.parseExpression("name == 'Nikola Tesla'");
    	boolean result = exp.getValue(tesla, Boolean.class);
    	// result == true
    

    在Bean定义中使用SpEL

        //调用类的静态方法
    	<bean id="numberGuess" class="org.spring.samples.NumberGuess">
    	    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/>
    	</bean>
    
        //调用其他Bean的属性,其中numberGuess是一个Bean的id,这个Bean有个randomNumber属性
        <bean id="shapeGuess" class="org.spring.samples.ShapeGuess">
    	    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/>
        </bean>
    

    Language Reference

    Literal Expressions

    将一个字符串定义为表达式

        ExpressionParser parser = new SpelExpressionParser();
    	String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
    	double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
    	// evals to 2147483647
    	int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
    	boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
    	Object nullValue = parser.parseExpression("null").getValue();
    

    Inline Data

        List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue(context);
        List listOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue(context);
    
    	Map inventorInfo = (Map) parser.parseExpression("{name:'Nikola',dob:'10-July-1856'}").getValue(context);
    	Map mapOfMaps = (Map) parser.parseExpression("{name:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}").getValue(context);
    

    参考博客

    下面给出一些常用列子

        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression("'Hello World'.bytes");
        byte[] bytes = (byte[]) exp.getValue();
    
        //调用一个类的静态方法
        @Value("#{T(java.lang.Math).random()}")
        private String randomValue;
    
        //调用一个Bean的方法
        @Value("#{randomValueGenerator.randValue()}")
        private String randomValue1;
    
        //调用其他bean的属性,这个属性必须是public的
        @Value("#{randomValueGenerator.age}")
        private String value;
    
        //获取系统变量的值
        //也可以通过占位符的方式获取
        @Value("#{systemProperties['user.dir']}")
        private String systemValue;
    
        @Value("#{systemEnvironment['user.dir']}")
        private String getSystemValue1;
        
        @Value("#{'${arrayConfig}'.split(',')}")
        private String[] array;
    
        @Value("#{'${intArray}'.split(',')}")
        private int[] intArray;
    
  • 相关阅读:
    java三大特性或java对象的三大特性?
    数据结构与算法第10周作业——二叉树的创建和遍历算法
    JDBC的应用
    数据结构与算法--第5周作业(线性表合并算法)
    数据结构与算法--第4周作业(单链表)
    WEB(JSP)下的JDBC操作实验
    application下的JDBC操作
    思考题:JSP的指令inclue和动作include的区别
    css3动画小试
    JS => 函数
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/13094601.html
Copyright © 2011-2022 走看看