今日は久しぶりにSpringSourceのサイトを覗いてみた。
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.