141
That old Spring magic has me in its SpEL Craig Walls

That old Spring magic has me in its SpEL

Embed Size (px)

DESCRIPTION

Presentation on the Spring Expression Language that I gave at SpringOne/2GX 2009 in New Orleans, LA.

Citation preview

Page 1: That old Spring magic has me in its SpEL

That old Spring magic has me in its SpEL

Craig Walls

Page 2: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

About me

Page 3: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

About me

• Java, Spring, and OSGi fanatic

Page 4: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

About me

• Java, Spring, and OSGi fanatic

• Principal consultant with Improving Enterprises

Page 5: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

About me

• Java, Spring, and OSGi fanatic

• Principal consultant with Improving Enterprises

• Author

Page 6: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

About me

• Java, Spring, and OSGi fanatic

• Principal consultant with Improving Enterprises

• Author

Page 7: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

3

Page 8: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

• Introducing SpEL

3

Page 9: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

• Introducing SpEL

• Using SpEL

3

Page 10: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

• Introducing SpEL

• Using SpEL

• SpEL Essentials

3

Page 11: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

• Introducing SpEL

• Using SpEL

• SpEL Essentials

• A few SpEL incantations

3

Page 12: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Agenda

• Introducing SpEL

• Using SpEL

• SpEL Essentials

• A few SpEL incantations

• Q & A

3

Page 13: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Download the examples

Approximately the same code...

http://spring.habuma.com/examples/SpEL-examples.zip

4

Page 14: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Introducing SpEL

Page 15: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

6

Page 16: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0

6

Page 17: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

6

Page 18: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

6

Page 19: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

• Much like Unified EL, OGNL, JBoss EL, and others

6

Page 20: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

• Much like Unified EL, OGNL, JBoss EL, and others

• Will be used across entire Spring portfolio

6

Page 21: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

• Much like Unified EL, OGNL, JBoss EL, and others

• Will be used across entire Spring portfolio

• Succinctly express complex concepts

6

Page 22: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

• Much like Unified EL, OGNL, JBoss EL, and others

• Will be used across entire Spring portfolio

• Succinctly express complex concepts

• Can be used to wire bean properties

6

Page 23: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

What is SpEL

• New in Spring 3.0– Originally conceived in Spring.NET

• The Spring Expression Language

• Much like Unified EL, OGNL, JBoss EL, and others

• Will be used across entire Spring portfolio

• Succinctly express complex concepts

• Can be used to wire bean properties

• Can be used outside of Spring

6

Page 24: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Using SpEL

Page 25: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Configuring beans with SpEL (XML)

Page 26: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Configuring beans with SpEL (XML)

<bean id="appConfigurer" class="com.habuma.spel.tests.Witch"> <property name="name" value="#{systemProperties['WITCH_NAME']}" /></bean>

Page 27: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Configuring beans with SpEL (@Value)

Page 28: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Configuring beans with SpEL (@Value)

@Componentpublic class Wizard { @Value("#{systemEnvironment['WIZARD_NAME']}") private String name;

// ...}

Page 29: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Programming with SpEL

Page 30: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Programming with SpEL

ExpressionParser parser = new SpelAntlrExpressionParser();

StandardEvaluationContext context = new StandardEvaluationContext(rootObject);

Expression ex = parser.parseExpression("witches.^[isWicked()]");

Witch wickedWitch = (Witch) ex.getValue(context);

Page 31: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Essential SpEL

Page 32: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

Page 33: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

Page 34: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{42}

Page 35: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{42} #{3.1415926}

Page 36: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{42} #{3.1415926}

#{1e4}

Page 37: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{true}

#{42} #{3.1415926}

#{1e4}

Page 38: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{true} #{false}

#{42} #{3.1415926}

#{1e4}

Page 39: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Literal expressions

#{'abracadabra'}

#{true} #{false}

#{42} #{3.1415926}

#{null}

#{1e4}

Page 40: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

Page 41: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

Page 42: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

#{systemProperties.WIZARD_NAME}

Page 43: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

#{systemProperties.WIZARD_NAME}

#{systemEnvironment['WIZARD_NAME']}

Page 44: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

#{systemProperties.WIZARD_NAME}

#{systemEnvironment['WIZARD_NAME']}

#{systemEnvironment.WIZARD_NAME}

Page 45: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

#{systemProperties.WIZARD_NAME}

#{systemEnvironment['WIZARD_NAME']}

#{systemEnvironment.WIZARD_NAME}

#{wizardBean.name}

Page 46: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{systemProperties['WIZARD_NAME']}

#{systemProperties.WIZARD_NAME}

#{systemEnvironment['WIZARD_NAME']}

#{systemEnvironment.WIZARD_NAME}

#{wizardBean.name}

Only available when using SpEL in Spring configuration

Page 47: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

Page 48: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{request.getParameter('wizardId')}

Page 49: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{request.getParameter('wizardId')}

#{session.getAttribute('wizard')}

Page 50: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ready-to-use variables

#{request.getParameter('wizardId')}

#{session.getAttribute('wizard')}

Can only be used to configure appropriately-scoped beans

Page 51: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Constructors

Page 52: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Constructors

#{new com.habuma.spel.tests.Wizard('Gandalf')}

Page 53: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Constructors

#{new com.habuma.spel.tests.Wizard('Gandalf')}

#{new String('hokus pokus')}

Page 54: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing object members

Page 55: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing object members

#{elf.name}

Page 56: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing object members

#{elf.name}

#{elf.Name}

Page 57: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing object members

#{elf.name}

#{elf.Name}

#{elf.getName()}

Page 58: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing object members

#{elf.name}

#{elf.Name}

#{elf.getName()}

#{elf.name?.length()}

Page 59: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Mixing expressions and text

Page 60: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Mixing expressions and text

The wizard’s name is #{wizard.name}

Embeds the wizard’s name in some text

Page 61: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

Page 62: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

Page 63: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52}

Page 64: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

Page 65: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

#{77 - 25}

Page 66: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

#{77 - 25} #{52 - -25}

Page 67: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

#{77 - 25} #{52 - -25}

#{6 * 7}

Page 68: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

#{77 - 25} #{52 - -25}

#{6 * 7} #{42 / 6}

Page 69: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Arithmetic operators

#{'Harry' + ' ' + 'Potter'}

#{25 + 52} #{2.19 + 2.02}

#{77 - 25} #{52 - -25}

#{6 * 7} #{42 / 6}

#{44 % 7}

Page 70: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

Page 71: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7}

Page 72: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7} #{7 > 42}

Page 73: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7} #{7 > 42}

#{10000 == 1e4}

Page 74: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7} #{7 > 42}

#{10000 == 1e4}

#{‘Apple’ == ‘Apple’}

Page 75: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7} #{7 > 42}

#{10000 == 1e4}

#{‘Apple’ == ‘Apple’}

#{‘Apple’ < ‘Orange’}

Page 76: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Relational operators

#{42 > 7} #{7 > 42}

#{10000 == 1e4}

#{‘Apple’ == ‘Apple’}

#{‘Apple’ < ‘Orange’} #{‘Orange’ > ‘Apple’}

Page 77: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Logical operators

Page 78: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Logical operators

#{witch.isWicked() and witch.name == 'Elphaba'}

Page 79: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Logical operators

#{witch.isWicked() and witch.name == 'Elphaba'}

#{witch.isWicked() or witch.name == 'Tattypoo'}

Page 80: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Logical operators

#{witch.isWicked() and witch.name == 'Elphaba'}

#{witch.isWicked() or witch.name == 'Tattypoo'}

#{!witch.isWicked()}

Page 81: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ternary and Elvis operator

Page 82: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ternary and Elvis operator

#{wizard.isGood() ? 'Gandalf' : 'Saruman'}

Page 83: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Ternary and Elvis operator

#{wizard.isGood() ? 'Gandalf' : 'Saruman'}

#{wizard.name ?: 'unknown'}

Page 84: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The type operator : T()

Page 85: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The type operator : T()

#{T(String)}

Page 86: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The type operator : T()

#{T(String)}

#{T(Math)}

Page 87: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The type operator : T()

#{T(String)}

#{T(Math)}

#{T(int)}

Page 88: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The type operator : T()

#{T(String)}

#{T(Math)}

#{T(int)}

#{T(java.util.Date)}

Page 89: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing class members

Page 90: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing class members

#{T(Math).floor(42.56)}

Page 91: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing class members

#{T(Math).floor(42.56)}

#{T(Math).PI}

Page 92: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

Page 93: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

#{‘Sabrina’ instanceof T(String)}

Page 94: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

#{‘Sabrina’ instanceof T(String)}

#{123 instanceof T(Integer)}

Page 95: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

#{‘Sabrina’ instanceof T(String)}

#{123 instanceof T(Integer)}

#{123L instanceof T(Long)}

Page 96: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

#{‘Sabrina’ instanceof T(String)}

#{123 instanceof T(Integer)}

#{123L instanceof T(Long)}

#{1.23 instanceof T(Double)}

Page 97: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

instanceof

#{‘Sabrina’ instanceof T(String)}

#{123 instanceof T(Integer)}

#{123L instanceof T(Long)}

#{true instanceof T(Boolean)}

#{1.23 instanceof T(Double)}

Page 98: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Regular expressions

Page 99: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Regular expressions

#{phoneNumber matches '\\d{3}-\\d{3}-\\d{4}'}

Page 100: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Regular expressions

#{phoneNumber matches '\\d{3}-\\d{3}-\\d{4}'}

#{websiteUrl matches 'http://www\\.[a-zA-Z0-9]*\\.(com|edu|net)'}

Page 101: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Regular expressions

#{phoneNumber matches '\\d{3}-\\d{3}-\\d{4}'}

#{customerEmail matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'}

#{websiteUrl matches 'http://www\\.[a-zA-Z0-9]*\\.(com|edu|net)'}

Page 102: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Setting variables

Page 103: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Setting variables

Assuming that the root object has a name property...

Page 104: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Setting variables

name = 'Broomhilda'

Assuming that the root object has a name property...

Page 105: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing collection members

Page 106: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing collection members

#{wizards[0]}

Arrays

Page 107: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Accessing collection members

#{wizards[0]}

#{magicWords['abracadabra']}

Arrays

Maps and Properties

Page 108: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection selection

Page 109: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection selection

#{witches.?[!isWicked()]}

Select all witches that aren’t wicked

Page 110: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection selection

#{witches.?[!isWicked()]}

#{witches.^[isWicked()]}

Select all witches that aren’t wicked

Select the first wicked witch

Page 111: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection selection

#{witches.?[!isWicked()]}

#{witches.^[isWicked()]}

#{witches.$[isWicked()]}

Select all witches that aren’t wicked

Select the first wicked witch

Select the last wicked witch

Page 112: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection projection

Page 113: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Collection projection

#{wizards.![name]}

Get the names of all wizards

Page 114: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The #this variable

Page 115: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

The #this variable

#{wizards.![name].?[#this > 'G']}

Get the names of all wizards whose name is lexically ordered after ‘G’

Page 116: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Adding a custom function

31

Only available with programmatic SpEL

Page 117: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Adding a custom function

31

context = new StandardEvaluationContext();parser = new SpelAntlrExpressionParser();context.registerFunction("inEnglish", EnglishNumberInator.class.getDeclaredMethod( "translate", new Class[] {int.class}));

Only available with programmatic SpEL

Page 118: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Adding a custom function

31

context = new StandardEvaluationContext();parser = new SpelAntlrExpressionParser();context.registerFunction("inEnglish", EnglishNumberInator.class.getDeclaredMethod( "translate", new Class[] {int.class}));

Expression ex = parser.parseExpression("#inEnglish(123)");String englishNumber = ex.getValue(context);

Only available with programmatic SpEL

Page 119: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Demo

Page 120: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

A few SpEL incantations

Page 121: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring in a system property (with a default)

Page 122: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring in a system property (with a default)

<bean class="Wizard"> <property name="name" value= "#{systemProperties['WIZARD_NAME'] ?: 'Gandalf'}" /></bean>

Page 123: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring bean references

Page 124: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring bean references

@Value("#{pricingService}")private PricingService pricingService;

Page 125: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring bean references

@Value("#{pricingService}")private PricingService pricingService;

<property name="pricingService" value="#{pricingService}" />

...or...

Page 126: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring bean references

@Value("#{pricingService}")private PricingService pricingService;

<property name="pricingService" value="#{pricingService}" />

Don’t do this!

...or...

Page 127: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Wiring bean references

@Value("#{pricingService}")private PricingService pricingService;

<property name="pricingService" value="#{pricingService}" />

Don’t do this!However...

...or...

Page 128: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective bean wiring

Page 129: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective bean wiring

@Value("#{systemProperties['PRICING'] == 'aggressive'" + "? aggressivePricing : regularPricing}")private PricingService pricingService;

Page 130: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective collection wiring

Page 131: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective collection wiring

public interface TaxRule { boolean appliesToState(String state); double calculateTax(double base);}

Page 132: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective collection wiring

public interface TaxRule { boolean appliesToState(String state); double calculateTax(double base);}

<util:list id="taxRules"> <ref id="revenueTax" /> <ref id="carpetTax" /> <ref id="existenceTax" /> <ref id="justBecauseTax" /></util:list>

Page 133: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Selective collection wiring

<bean id="taxProcessor" class="TaxProcessor" scope="session"> <aop:scoped-proxy /> <property name="taxRules" value= "#{taxRules.?[appliesToState(session.getAttribute('user').state)]}" /></bean>

public interface TaxRule { boolean appliesToState(String state); double calculateTax(double base);}

<util:list id="taxRules"> <ref id="revenueTax" /> <ref id="carpetTax" /> <ref id="existenceTax" /> <ref id="justBecauseTax" /></util:list>

Page 134: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

38

Page 135: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

38

Page 136: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

• SpEL expressions are just Strings...no compile-time help to ensure type-safety, syntax, etc.

38

Page 137: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

• SpEL expressions are just Strings...no compile-time help to ensure type-safety, syntax, etc.

• Don’t abuse SpEL

38

Page 138: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

• SpEL expressions are just Strings...no compile-time help to ensure type-safety, syntax, etc.

• Don’t abuse SpEL

– Remember Goethe’s Sorcerer’s Apprentice

38

Page 139: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

• SpEL expressions are just Strings...no compile-time help to ensure type-safety, syntax, etc.

• Don’t abuse SpEL

– Remember Goethe’s Sorcerer’s Apprentice

– A little bit of magic in the wrong hands can be dangerous

38

Page 140: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Parting thoughts

• SpEL expressions are great for doing Spring configuration magic

• SpEL expressions are just Strings...no compile-time help to ensure type-safety, syntax, etc.

• Don’t abuse SpEL

– Remember Goethe’s Sorcerer’s Apprentice

– A little bit of magic in the wrong hands can be dangerous

• Write tests!!!

38

Page 141: That old Spring magic has me in its SpEL

SpringOne 2GX 2009. All rights reserved. Do not distribute without permission.

Q&A

Thank you!Don’t forget to turn in your evaluations!!!