基本機能について説明します。
ポイント
Spring Frameworkは定義されたBeanをデフォルトでSingletonとして管理しています。変更したい場合にはSpring Frameworkが提供しているBeanスコープ機能を利用してください。
DIコンテナはコンポーネント(クラス)間の依存関係をソースコードから取り除き、実行時まで依存関係を持たないようにするデザインパターンに基づいて作られたコンポーネント群を集中管理するための機能です。
Spring Frameworkでは、オブジェクトが必要とする情報をBean定義ファイルと呼ばれるXML形式の外部ファイルへ定義し、アプリケーション実行時にDIコンテナが定義された情報を注入してオブジェクトのインスタンスを生成します。
DIコンテナを利用する事によって、以下の利点を得る事ができます。
アプリケーションの拡張性を高められる
単体テストが容易になる
コンポーネントの可搬性を高められる
StringからIntergerへの変換やArrayからCollectionへの変換、Dateを文字列化する際の整形など、Webアプリケーションで頻繁に使用される型変換機能、およびフォーマット機能のためのService provider interface(SPI)を提供します。
SPIを実装してbean定義内で登録することで、SpringFrameworkが変換を行う際に指定したクラスが使用されます。
例
Javaソース:
class StringToDateConverter implements Converter<String, Date> { public Date convert(String s) { return DateFormat.parse(s); } } |
bean定義:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="StringToDateConverter"/> </list> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"/> |
bean定義やアノテーションに#{...}という構文を使用して動的な値を利用できます。
例1は、user.timezoneというシステムプロパティの値を取得する例です。また、例2は、他のbeanの値を取得する例です。例3は、アノテーションを使用した例です。
例
例1 システムプロパティの値を取得:
<bean id="fooSample" class="xxx.FooSampleImpl"> <property name="timezone" value="#{ systemProperties['user.timezone'] }"/> </bean> |
例2 beanの値を取得:
<bean id="fooSample2" class="xxx.fooSample2Impl"> <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> </bean> <bean id="fooSample3" class="xxx.fooSample3Impl"> <property name="seed" value="#{ fooSample2.randomNumber }"/> </bean> |
例3 アノテーションを使用:
public static class FooSampleImpl{ @Value("#{ systemProperties['user.timezone'] }") private String timezone; public void setTimezone (String timezone){ this.timezone = timezone; } public String getTimezone (){ return this.timezone; } } |