35
SPRING FRAMEWORK 3.0 Spring Expression Language Dmitry Noskov Spring Framework - Expression Language

Spring Framework - Expression Language

Embed Size (px)

DESCRIPTION

The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime. The language syntax is similar to Unified EL but offers additional features, most notably method invocation and basic string templating functionality.

Citation preview

Page 1: Spring Framework - Expression Language

SPRING FRAMEWORK 3.0

Spring Expression Language Dmitry Noskov

Spring Framework - Expression Language

Page 2: Spring Framework - Expression Language

What is SpEL?

is a powerful expression language

much like OGNL, Jboss EL, etc.

supports querying and manipulating an object

graph at runtime

can be used across all the products in the Spring

portfolio

can be used outside of Spring

Dmitry Noskov Spring Framework - Expression Language

Page 3: Spring Framework - Expression Language

Features

expressions

accessing properties, arrays, etc.

assignment

method invocation

collection selection & projection

etc.

Dmitry Noskov Spring Framework - Expression Language

Page 4: Spring Framework - Expression Language

Fundamentals

ExpressionParser

Expression

getValue

setValue

EvaluationContext

root

setVariable

propertyAccessor

Dmitry Noskov Spring Framework - Expression Language

Page 5: Spring Framework - Expression Language

Expression access

configuration XML / @Value

#{expression}

programming

parser.parseExpression(“expression for root”)

parser.parseExpression(“#expression for variable”)

custom template

parser.parseExpression(“it is #{expression}”)

Dmitry Noskov Spring Framework - Expression Language

Page 6: Spring Framework - Expression Language

Using SpEL

Dmitry Noskov Spring Framework - Expression Language

Page 7: Spring Framework - Expression Language

XML

<bean id="systemConfig" class="org.training.spel.SystemConfig">

<property name="operatingSystem"

value="#{systemProperties['os.name']}"/>

<property name="javaVersion"

value="#{systemProperties['java.vm.version']}"/>

</bean>

Dmitry Noskov Spring Framework - Expression Language

Page 8: Spring Framework - Expression Language

@Value

public class SystemConfig {

@Value("#{systemProperties['java.vm.version']}")

private String operatingSystem;

@Value("#{systemProperties['java.vm.version']}")

private String javaVersion;

}

Note: <context:annotation-config/>

Dmitry Noskov Spring Framework - Expression Language

Page 9: Spring Framework - Expression Language

Expressions

Dmitry Noskov Spring Framework - Expression Language

Page 10: Spring Framework - Expression Language

Literal expressions

ExpressionParser parser = new SpelExpressionParser();

parser.parseExpression("'Hello World'").getValue(String.class);

parser.parseExpression("6.0221415E+23").getValue(Double.class);

parser.parseExpression("0x7FFFFFFF").getValue(Integer.class);

parser.parseExpression("'2011/01/17'").getValue(Date.class);

parser.parseExpression("true").getValue();

parser.parseExpression("null").getValue();

Dmitry Noskov Spring Framework - Expression Language

Page 12: Spring Framework - Expression Language

Object properties

Dmitry Noskov Spring Framework - Expression Language

#{person.name}

#{person.Name}

#{person.getName()}

Page 13: Spring Framework - Expression Language

Collections

#{list[0]}

#{list[0].name}

#{map[‘key’]}

Dmitry Noskov Spring Framework - Expression Language

Page 14: Spring Framework - Expression Language

Methods

#{‘Some Text’.substring(0, 2)}

#{‘Some Text’.startsWith(‘text’)}

#{“variable.toString()”}

Dmitry Noskov Spring Framework - Expression Language

Page 15: Spring Framework - Expression Language

Relational operators

#{5 == 5} or #{5 eq 5}

#{‘black’ > ’block’} or #{‘black’ gt ‘block’}

#{‘text’ instanceof T(int)}

#{'5.00' matches '^-?\\d+(\\.\\d{2})?$'}

Dmitry Noskov Spring Framework - Expression Language

Page 16: Spring Framework - Expression Language

Arithmetic operators

#{5 + 5}

#{(5 + 5) * 2}

#{17 / 5 % 3}

#{‘Hello’ + ‘ ‘ + ‘world’}

Dmitry Noskov Spring Framework - Expression Language

Page 17: Spring Framework - Expression Language

Logical operators

#{true or false}

#{!true}

#{not isUserInGroup(‘admin’)}

Dmitry Noskov Spring Framework - Expression Language

Page 18: Spring Framework - Expression Language

Assignment

SimpleBean dima = new SimpleBean("Dima", 26);

EvaluationContext context = new StandardEvaluationContext(dima);

parser.parseExpression("name").setValue(context, "Dmitry");

parser.parseExpression("age=27").getValue(context);

Dmitry Noskov Spring Framework - Expression Language

Page 19: Spring Framework - Expression Language

Type operator

#{T(java.util.Date)}

#{T(String)}

#{T(int)}

accessing static class members

#{T(Math).PI}

#{T(Math).random()}

Dmitry Noskov Spring Framework - Expression Language

Page 20: Spring Framework - Expression Language

instanceof

#{‘text’ instanceof T(String)}

#{27 instanceof T(Integer)}

#{false instanceof T(Boolean)}

Dmitry Noskov Spring Framework - Expression Language

Page 21: Spring Framework - Expression Language

Constructor

#{new org.training.spel.Person(‘Misha’, 28)}

#{list.add(new org.training.spel.Person())}

Dmitry Noskov Spring Framework - Expression Language

Page 22: Spring Framework - Expression Language

Variable registration

Map<String, Person> map = new HashMap<String, Person>();

map.put("Dima", new Person("Dima", 27));

map.put("Anya", new Person("Anya", 23));

ExpressionParser parser = new SpelExpressionParser();

StandardEvaluationContext ctx = new StandardEvaluationContext();

ctx.setVariable("map", map);

ctx.setVariable("anya", "Anya");

parser.parseExpression("#map['Dima']").getValue(ctx);

parser.parseExpression("#map[#anya]").getValue(ctx);

Dmitry Noskov Spring Framework - Expression Language

Page 23: Spring Framework - Expression Language

If-then-else

#{person.age>50 ? ‘Old’ : ‘Young’}

#{person.name ? : ‘N/A’}

Dmitry Noskov Spring Framework - Expression Language

Page 24: Spring Framework - Expression Language

Safe navigation

#{address.city?.name}

#{person.name?.length()}

Dmitry Noskov Spring Framework - Expression Language

Page 25: Spring Framework - Expression Language

Collection selection

select all

#{list.?[age>20]}

#{list.?[name.startsWith(‘D’)]}

select first

#{list.^[age>20]}

select last

#{list.$[getAge()>20]}

Dmitry Noskov Spring Framework - Expression Language

Page 26: Spring Framework - Expression Language

Collection projection

select the names of all elements

#{list.![name]}

select the names length of all elements

#{list.![name.length()]}

Dmitry Noskov Spring Framework - Expression Language

Page 27: Spring Framework - Expression Language

Functions

ExpressionParser parser = new SpelExpressionParser();

EvaluationContext context = new StandardEvaluationContext();

context.registerFunction("max", Collections.class.

getDeclaredMethod("max", new Class[]{Collection.class}));

parser.parseExpression("#max(#list.![age])").getValue(context);

Dmitry Noskov Spring Framework - Expression Language

Page 28: Spring Framework - Expression Language

Templating

ExpressionParser parser = new SpelExpressionParser();

String value = parser.parseExpression(

"Random number is #{T(java.lang.Math).random()}",

new TemplateParserContext()

).getValue(String.class);

But:

parser.parseExpression("#{#primes.?[#this>10]}", …)

Dmitry Noskov Spring Framework - Expression Language

Page 29: Spring Framework - Expression Language

#root and #this

array of integer list.addAll(Arrays.asList(2,3,5,7,11,13,17));

p.parseExpression("#list.?[#this>10]").getValue(context);

list of age List<Person> list = new ArrayList<Person>();

p.parseExpression("#list.![age].?[#this>20]").getValue(context);

Dmitry Noskov Spring Framework - Expression Language

Page 30: Spring Framework - Expression Language

Using root object

Dmitry Noskov Spring Framework - Expression Language

unchanging StandardEvaluationContext context = new

StandardEvaluationContext(new Person("Dima", 25));

parser.parseExpression("name").getValue(context);

changing parser.parseExpression("name").getValue(new Person("Dima", 27));

cached context StandardEvaluationContext context = new

StandardEvaluationContext(new Person("Dima", 25));

parser.parseExpression("name").getValue(context, person1);

parser.parseExpression("name").getValue(context, person2);

Page 31: Spring Framework - Expression Language

Access to Spring context

Dmitry Noskov Spring Framework - Expression Language

<bean id="simpleBean" class="org.training.spel.Person"

p:name="Misha" p:age="#{25+23}"/>

ApplicationContext context =

new ClassPathXmlApplicationContext("context.xml");

Person bean = context.getBean(Person.class);

ExpressionParser parser = new SpelExpressionParser();

StandardEvaluationContext evaluation =

new StandardEvaluationContext(context);

evaluation.addPropertyAccessor(new BeanFactoryAccessor());

parser.parseExpression("simpleBean").getValue(evaluation);

Page 32: Spring Framework - Expression Language

Wiring properties

simple @Value("#{systemProperties['locale']}")

private Locale locale;

default @Value("#{systemProperties['locale']?:'RU'}")

private Locale locale;

selective @Value("#{systemProperties['level']>2 ? gold : default}")

private AccountRepository repository;

Dmitry Noskov Spring Framework - Expression Language

Page 33: Spring Framework - Expression Language

Information

Dmitry Noskov Spring Framework - Expression Language

Spring type conversion reference

http://static.springsource.org/spring/docs/3.0.x/spring-

framework-reference/html/validation.html#core-convert

Spring EL reference

http://static.springsource.org/spring/docs/3.0.x/spring-

framework-reference/html/expressions.html

Page 34: Spring Framework - Expression Language

Questions

Dmitry Noskov Spring Framework - Expression Language

Page 35: Spring Framework - Expression Language

The end

http://www.linkedin.com/in/noskovd

http://www.slideshare.net/analizator/presentations