Spring3.0の新機能

今日は久しぶりにSpringSourceのサイトを覗いてみた。

SpringSource.org |

Spring3.0のベータ版開発がけっこう進んでたんだね。

このエントリを書いてる時現在のバージョンが

3.0.0 M4なんで、これまでの感じだと

3.0.0Mいくつか → 3.0.0RCいくつか → 3.0.1

って感じで正式バージョンになっていくのかな。

って事でリファレンスを軽く読んでみた。

Spring3.0の新機能を並べてみる。

ちなみに、リファレンスの内容を拾ってるだけで、動作確認まではしていないのであしからずです。

Spring Expression Language

いきなりだけど、これが今回の目玉かな。

Spring Expression Languageっていう独自のEL式が実装されているらしい。

略してSpEL。

bean設定ファイルや後述するアノテーションの引数の中で使用可能らしい。

こんな感じ

<bean id=”sample1″ class=”…”>

<property name=”propA” value=”ABC” />

</bean>

<bean id=”sample2″ class=”…”>

<property name=”propB” value=”#{ sample1.prop }”/>

</bean>

#{ bean名.プロパティ名 } で、beanのプロパティが取得できるとの事。

記号が違うだけで、この辺はJSPのEL式と一緒。

#{ T(クラス).メソッド() } って構文で

staticメソッドの呼び出しも可能。

<bean id=”numberGuess” class=”org.spring.samples.NumberGuess”>

<property name=”randomNumber” value=”#{ T(java.lang.Math).random() * 100.0 }”/>

</bean>

もちろん演算も

#{ 1 + 1 }

ってな感じで可能。

ちなみに、Javaソース上でSpEL式を評価する事も可能らしく

ExpressionParser parser = new SpelExpressionParser();

// Members List

StandardEvaluationContext societyContext = new StandardEvaluationContext(ieee);

// evaluates to “Nikola Tesla”

String name = parser.parseExpression(“Members[0].Name”).getValue(societyContext, String.class);

って感じでいけるらしい。

The Inversion of Control (IoC) container

もともとはSpring Java Configuration Projectの機能だったらしい。

http://www.springsource.org/javaconfig

どうやら、これまではbean設定ファイルでbeanを定義していたけれど、

こいつをJavaソースでも行えるようにする仕組み。

伴い、以下のアノテーションが追加されている

  • @Configuration
  • @Bean
  • @Primary
  • @Lazy
  • @Import
  • @Value

で、どんな感じかというと、これまではbean設定ファイルで

<beans>

<bean name=”transferService” class=”com.acme.TransferServiceImpl”/>

</beans>

と記述していたのを

@Configuration

public class AppConfig {

@Bean

public TransferService transferService() {

return new TransferServiceImpl();

}

}

といったように、Javaソースでbean生成の処理を記述できるようになる。

このConfigurationクラスを有効にするには設定ファイルにて

<context:component-scan base-package=”com.myco.config”/>

といったように、Configurationクラスをコンポーネントスキャンの対象にしてやれば良いらしい。

で、このIoCによって追加されたアノテーション達、様々な使い方ができるらしい。

例えば

public static class FieldValueTestBean

@Value(“#{ systemProperties[‘user.region’] }”)

private String defaultLocale;

public void setDefaultLocale(String defaultLocale){

this.defaultLocale = defaultLocale;

}

public String getDefaultLocale(){

return this.defaultLocale;

}

}

@Valueアノテーション。

こいつの引数には前述のSpEL式を使用でき、式によって解釈されたオブジェクトがインジェクションされる。

フィールドだけでなく、メソッドに対して@ValueでもOK

public static class PropertyValueTestBean

private String defaultLocale;

@Value(“#{ systemProperties[‘user.region’] }”)

public void setDefaultLocale(String defaultLocale){

this.defaultLocale = defaultLocale;

}

public String getDefaultLocale(){

return this.defaultLocale;

}

}

更には、引数に対しても@Valueが使用可能

public class SimpleMovieLister {

private MovieFinder movieFinder;

private String defaultLocale;

@Autowired

public void configure(MovieFinder movieFinder,

@Value(“#{ systemProperties[‘user.region’]”} String defaultLocale) {

this.movieFinder = movieFinder;

this.defaultLocale = defaultLocale;

}

// …

}

なるほどねぇ。

各実装担当者が勝手に使ってしまうのには怖い感じもするけれど、工夫次第で面白い使い方もできそうだ。

O/X Mappers

JavaオブジェクトとXMLのマッピング機能。

XML構造⇔Javaオブジェクトの自動マッピング機能なのかな。

Comprehensive REST support

RESTサポートの強化。

SpringMVCって良く知らないんだけど、サーバ側の処理では

以前からhttpメソッドの切り分け機能はあったみたいだし、何が新機能なのかいまいちよく分からなかった。

ただ、クライアント側の処理では

RestTemplateなるものが追加されていて、こんな書き方ができるようになっているみたい

String result = restTemplate.getForObject(

http://example.com/hotels/{hotel}/bookings/{booking}”,

String.class,”42″, “21”);

これはシンプルでいいかも。

Support for embedded databases

組み込みデータベースのサポート。

HSQL, H2, DerbyなどのDBがサポートされているとの事。

で、感想

SpELがやはり気になる所。

Spring2.5までは設定ファイル内で、別のbeanから値を取得してどうのこうの・・みたいな事ができなくて

「くそう、seasarならOGNLでやってやるのに」って場面が多かったけど、

Spring3.0からはSpEL式で記述できるようになるって事だね。

これは嬉しい。

ってか、Spring2.0からのAutowireといい、seasarの後追いをしてる感はいなめないなぁ。

seasarは、よりシンプルな方法でずっと前から実現してきた事だし・・・

IoCの@ConfigurationによるJavaベースのbean生成や、

@Valueによるインジェクションも興味深い所かな。

そのほかの追加アノテーションも、色々な事ができそう。

組み込みDBやRESTやXMLマッピング機能なんかは、役に立つ場面もあるかもしれないけど

無理にSpringに組み込まなくても・・って感じはあるかなぁ

それぞれ既存のライブラリは色々ある訳だし。。

Comments are closed.