読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

Spring-3.0.0へ移行

Spring

Spring-3.0.0がさりげなくリリースされていたので、現在開発中のR42FW(次期バージョン)をSpring-3.0.0へお引越ししました。

新機能は?

超適当な和訳で恐縮ですが、新機能はこんな感じらしいです。Spring MVCへの機能追加が多い模様。


個人的にはJSR-303がどこまで役に立つのか気になっている程度で、他の機能は興味ナシです。

* Spring expression language (SpEL): a core expression parser for use in bean definitions, allowing for references to nested bean structures (e.g. properties of other beans) as well as to environmental data structures (e.g. system property values) through a common #{…} syntax in property values.


* Spring expression language (SpEL): ユーザーBean定義XMLにおいて使えるEL。環境変数(システムプロパティとか)と同じような感じで他のBeanのプロパティ(Bean構造がネストしているのもOK)を参照することができる。書式は#{...}だ。



* Extended support for annotation-based components: now with the notion of configuration classes and annotated factory methods (as known from Spring JavaConfig). Spring also allows for injecting configuration values through @Value expressions now, referring to configuration settings via dynamic #{…} expressions or static ${…} placeholders.


アノテーションベースコンポーネントのさらなるサポート: 設定クラスとアノテーション付きファクトリメソッド(Spring JavaConfig)。Springは設定パラメータを@Valueを使ってInjectionできるし、#{...}や${...}を使って参照することもできる。



* Powerful stereotype model: allows for creating 'shortcut' annotations through the use of meta-annotations, e.g. for default scopes and default transactional characteristics on custom stereotypes. Imagine a custom @MyService annotation indicating @Service, @Scope("request") and @Transactional(readOnly=true) through a single annotation.


* 強力なステレオタイプモデル: メタアノテーションを使って、"ショートカット"アノテーションを作ることができる。例えばデフォルトのスコープとトランザクション特性をカスタムステレオタイプとして定義できる。つまり@MyServiceというのを作って、それに@Serviceと@Scope("request")と@Transactional(readOnly=true)をいっぺんに指定したのと同じ意味を持たせたりできる、ってことだ。



* Standardized dependency injection annotations: Spring 3.0 comes with full support for the JSR-330 specification for Dependency Injection in Java – annotation-driven injection via @Inject and its associated qualifier and provider model, as an alternative to Spring's own @Autowired and co.


* 標準化された依存性注入アノテーション: Spring 3.0はJSR-330をフルサポートしている。JSR-330で規定された@Injectアノテーションは、Springの@Autowiredと同じようなことができる。



* Declarative model validation based on constraint annotations: Spring-style setup of a JSR-303 Bean Validation provider (such as Hibernate Validator 4.0). Comes with an annotation-driven validation option in Spring MVC, exposing a unified view on constraint violations through Spring’s binding result facility.


* 制約アノテーションによる宣言的モデルバリデーション: Spring風のJSR-303 ビーンバリデーションプロバイダ(Hibernate Validator 4.0のようなもの)が使える。アノテーションベースのバリデーションをSpring MVCで使うと、制約違反しているBeanの一覧をBeanバインディング結果として通知してくれる。



* Enhanced binding and annotation-driven formatting: Converter and Formatter SPIs as an alternative to standard PropertyEditors. Formatting may be driven by annotations in a style similar to JSR-303 constraints, e.g. using @DateTimeFormat. Also, check out the new mvc namespace for convenient setup of formatting and validation in Spring MVC.


* 拡張されたBeanバインディングアノテーションベースのテキスト整形: 標準ProperyEditorsの代替としてのコンバータとフォーマッタ。テキスト整形はJSR-303の制約アノテーションと同じような感じで行える。例えば@DateTimeFormatとかを使うことになる。あと、新しいMVC名前空間はテキスト整形とバリデーションの設定を簡単にしてくれるから要チェックだ。



* Comprehensive REST support: native REST capabilities in Spring MVC, such as REST-style request mappings, URI variable extraction through @PathVariable parameters, and view resolution driven by content negotiation. Client-side REST support is available in the form of a RestTemplate class.


* 包括的なRESTサポート: Spring MVCはRESTをバッチリサポートしている。REST式リクエストマッピングとか、URI変数の抽出(@PathVariableを使え)とか、コンテントネゴシエーションによるビューの解決とか(←訳注: なんのこっちゃ?)。あと、RestTemplateクラスを使うことで、クライアントサイドRESTをサポートするようにした。



* Rich native Portlet 2.0 support: Spring MVC fully supports Portlet 2.0 environments and Portlet 2.0’s new event and resource request model. Includes specialized mapping facilities for typical portlet request characteristics: @ActionMapping, @RenderMapping, @ResourceMapping, @EventMapping.


* Portlet2.0のネイティブサポート: Spring MVCはPortlet2.0をバッチリサポート。もちろんPortlet2.0のイベント及びリソースモデルもだ。@ActionMappingや@RenderMapping、@ResourceMapping、@EventMappingもサポートしている。



* Object/XML Mapping (OXM): as known from Spring Web Services, now in Spring Framework core. Marshalling and Unmarshaller abstractions with out-of-the-box support for JAXB 2, Castor, etc. Comes with integration options for XML payloads in Spring MVC and Spring JMS.


* Object/XMLマッピング: Spring Web Serviceで使っているやつ。Spring-3.0からはcoreに統合された。JAXB 2やCaster向けのXML→ObjectとObject→XMLがすぐに使えるようになっている。Spring MVCとSpring JMSのXMLペイロードで使えるようにするオプションもあるよ。



* Next-generation scheduling capabilities: new TaskScheduler and Trigger mechanisms with first-class cron support. Spring 3.0 comes with a convenient task namespace and also supports @Async and @Scheduled annotations now. This can be executed on top of native thread pools or server-managed thread pools.


* 高機能なスケジューリング: タスクスケジューラーとトリガーの仕組みでcron相当の機能ができる。Spring-3.0はタスク名前空間と@Async、@Scheduledアノテーションを提供する。これはネイティブスレッドプールやサーバ管理下のスレッドプールで実行できる。

乗り換え作業

ソースコードを修正する必要があった箇所はひとつだけ。

Map ListableBeanFactory.getBeansOfType(Class type);

シグネチャ

<T> Map<String, T> ListableBeanFactory.getBeansOfType(Class<T> type);

に変わっていたので、それに対応しただけです。


後は何もしなくても、特に問題なく動作しています。スバラシイ。

しかし…

動作は問題ないのですが、ひとつ面倒な変更が。


僕はMavenの思想が受け入れられないのでApache Ant&Ivyを使っているのですが、
これまでは、spring-2.5.6.jarひとつだけをライブラリとして登録すれば済んでいたのに、

<dependency org="org.springframework" name="spring" rev="2.5.6.SEC01" conf="..." />


Spring-3.0からは次のように書かないとダメっぽい。
どうやら今回のリリースから、Springの各コンポーネントはバラバラにリリースされるようになったみたいです。

<dependency org="org.springframework" name="spring-aop" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-asm" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-core" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-instrument" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-beans" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-context" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-jdbc" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-orm" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-tx" rev="3.0.0.RELEASE" conf="..." />
<dependency org="org.springframework" name="spring-web" rev="3.0.0.RELEASE" conf="..." />


ぶっちゃけ、メンドクサイ(-_-)