4.Spring Expression langage
(SpEL式:Spring3.0から追加されたEL式)

概要

Spring3.0の新機能です。Spring Expression Language(SpEL式)と呼びます。

JSPなどを扱ったことがある方は、EL式をご存知かと思います。

例えばあるオブジェクトの値を、${member.name}のような形式で member.getName()の値を取得できます。

SpEL式はそれを拡張した言語です。

主にできることは以下の内容です。

・ApplicationContextのXMLファイル内で使用できます。もちろん、XML内で定義したbeanも式の中で使用することもできます。

・SpEL式をプログラム上で使用することもできます。SpEL式の文字列をパースクラスに渡すことで実現します。

ここではこれくらいにして、以下で具体的に例題を見ていただければと思います。

XML内でのSpEL式の使用例

【XML内での使用例】

<bean id="myClass" class="com.my.MyClass">

<property name="name" value="太郎"/>

<property name="age" value="21"/>

</bean>

<bean id="test" class="com.my.Test">

<property name="defaultName" value="こんにちは! #{myClass.name}さん"/>

</bean>

赤字の部分がSpEL式です。

#{}で括られた中に式を書きます。

上記の場合は、myClassというbean名のgetName()を呼び出します。#{}は、"太郎"という文字列に置き変わります。

もちろん、String以外の型を指定してvalue属性に設定することもできます。(例: value="#{myClass.goodsList}" )

このほかにも、getter以外のメソッドを呼び出すこともできますので、ほぼ何でもできます。

プログラムでのSpEL式の使用例

【プログラムでの使用例】

ExpressionParser parser = new SpelExpressionParser();

Expression exp = parser.parseExpression(”name == '太郎'”);

Member mem = new Member();

mem.setName("太郎")

boolean value = exp.getValue(mem, Boolean.class);

上記のような具合で式を評価して値を取得できます。

評価した式にオブジェクト渡します。

上記の場合、 mem.getName() == "太郎" という式を実行したことになります。

雰囲気をつかむための概要はこのあたりにして、式で使用できる主な表現を見ていくことにします。

SpEL式で使用できる表現

演算子

== , >, >=, +-*/ などの演算子はそのまま使用できますが、perlのような eq, gt, geなどの表現も使えます。

※T()は、タイプ(型)を表します。

&&、|| などは、and, orを使用します。

文字列、数字

文字列は、シングルクォート(') で括ります。もし、シングルクォート自体を使用したい場合、2つ重ねます('')。

数字はそのまま記述します。

配列、マップ

配列やマップは以下のように記述します。

コンストラクタ(new), メソッド

newしたり、メソッドを呼び出すこともできます。

【注意点】

メソッドを呼び出せると記述しましたが、セキュリティ上の配慮でgetClass()は呼び出せないようです。

参考: http://forum.springsource.org/showthread.php?98570-Getting-Payload-Classname-in-Header-Enricher-via-SpEL

staticメソッドの呼び出し

staticメソッドは、型を指定して呼び出します。

【記述例】

T(java.util.Calendar).getInstance()

Tはタイプ(型)の指定をするためのものです。

Collectionセレクション

Collectionセレクションとは、特定の条件を満たすもののみを抽出する表現です。

【配列におけるセレクションの例】

Members.?[name == '太郎']

MembersはListです。

ですので上記を評価すると要素(Member)のgetName() の値が"太郎"のもののみをListで返します。

【マップにおけるセレクションの例】

①MemberMap.?[value.age > 27]

②MemberMap.^[key.startsWith('太')]

③MemberMap.$[key.startsWith('太')]

Mapの場合はEntryオブジェクトに対して評価されますので、上記はそれぞれ以下のようになります。

①Mapの値のageプロパティの値が27より大きい要素をMapにつめて返します。

②Mapのキーが"太"から始まる要素のうち、一番最初に見つかったものを返します。

③Mapのキーが"太"から始まる要素のうち、一番最後に見つかったものを返します。

^, $の表現は配列にも使用できます。

Collectionプロジェクション

Collectionプロジェクションは、各要素の指定のプロパティを抽出し、Listにします。

【配列におけるプロジェクションの例】

Members.![address.prefecture]

!を記述すると、Collectionプロジェクションを使用できます。

上記の例では、各要素のaddressプロパティのprefecture(県名)を取得し、Listにした結果を返します。

Mapに対してもCollectionプロジェクションは使えます。返り値は、Listになります。また、評価の対象はEntryオブジェクトになります。

【マップにおけるプロジェクションの例】

MemberMap.![value.address.prefecture]

上記の例では、prefectureプロパティが返すオブジェクトをListにしたオブジェクトを返します。

システムプロパティの値の取得

システムプロパティを参照することもできます。

systemProperties['user.region']

上記のようにすると、システムプロパティを取得できます。

【注意点】

注意点があります。

systemPropertiesは予約語になっています。もし、XMLのbean名としてsystemPropertiesを指定すると、そのbeanを指定することになってしまいます。

ですので、bean名でこの予約語を上書きしないように気をつけてください。

Created Date: 2011/10/21