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()は呼び出せないようです。
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