Spring Frameworkとは
Spring Frameworkは、
Javaプラットフォーム向けのオープンソースの
アプリケーションフレームワークです。単に「Spring」とも呼ばれます。ロッド・ジョンソンが著書『Expert One-on-One J2EE Design and Development』と共に2002年に発表したのが始まりです。その後、
.NET Framework向けの移植版も登場しました。2006年には、Spring Framework 1.2.6がJolt productivity awardを受賞しています。
Spring Frameworkは、特定のプログラミングモデルを強制するものではありませんが、Javaコミュニティでは
Enterprise JavaBeans(EJB)モデルの代替として広く認識されています。このフレームワークは、Java開発者に高い自由度を与えつつ、豊富なドキュメントと使いやすいソリューションを提供します。特に、
Jakarta EE上でWebベースのアプリケーションを構築するための拡張機能が充実しており、この用途で多く利用されています。最初のリリースは2003年6月で、
Apache License 2.0で
ライセンスされています。1.0のリリースは2004年3月です。
概要
Spring Frameworkは、
Javaプラットフォームでアプリケーションを開発する際に直面する課題を解決するためのソリューションを提供します。
Jakarta EEに限定されず、広範なインテグレーションを可能にする点が、広く採用される重要な理由の一つです。従来のプログラミングモデルにこだわらず、複雑なアプリケーションを効率的に作成するための機能を提供します。また、
Javaプラットフォームにおける新しい機能をいち早く取り入れることでも知られています。
Spring Frameworkは、一貫したモデルを提供し、
Javaプラットフォーム上で作成される様々なアプリケーションに適用可能なフレームワークです。
モジュール
Spring Frameworkは、様々なサービスを提供する複数のモジュールから構成されています。
- - 制御の反転(IoC)コンテナ: 依存性の注入を通じて、アプリケーションのコンポーネントの配置とJavaオブジェクトのライフサイクルを管理します。
- - アスペクト指向プログラミング(AOP): クラスを横断する処理の実装を可能にします。
- - データアクセス: JDBCやオブジェクト関係マッピングツールを利用して、JavaプラットフォームでのRDBアクセス機能を提供します。NoSQLデータベースもサポートしています。
- - トランザクション管理: 各種トランザクション制御APIを統合し、Javaオブジェクトのトランザクション管理を提供します。
- - Model View Controller (MVC): HTTPとServletベースのフレームワークで、WebアプリケーションやRESTful Webサービスの拡張とカスタマイズのためのフックを多数提供します。
- - リモートアクセスフレームワーク: 遠隔手続き呼び出し(RPC)を用いて、Javaオブジェクトをネットワーク上でインポートまたはエクスポートします。RMI、CORBA、HTTPベースのプロトコル(SOAPなど)をサポートします。
- - 設定より規約(Convention over Configuration): Spring Rooモジュールにより、Springベースの業務アプリケーションのRAD(迅速なアプリケーション開発)ソリューションを提供します。
- - バッチ処理: 大量データ処理向けのフレームワークとして、ログ取得、トランザクション管理、統計情報取得、ジョブの再起動や起動抑制、リソース管理などの機能を提供します。
- - 認証・認可フレームワーク: Spring Securityサブプロジェクトを利用して、ユーザー定義の認証・認可機能を提供します。各種標準、プロトコル、ツール、手法をサポートします。
- - リモート管理フレームワーク: JMXを使って、ローカルおよびリモートのJavaオブジェクトの構成を管理します。
- - メッセージフレームワーク: 標準的なJMSのAPIを拡張し、JMSメッセージキューから透過的にメッセージを受信するためのリスナーオブジェクトを登録できます。
- - テスト機能: 単体テストと結合テストを作成するためのクラス群を提供します。
Inversion of Control (IoC) コンテナ
Spring Frameworkの中核をなすIoCコンテナは、コールバックを通じてJavaオブジェクトの設定と管理の一貫した手段を提供します。このコンテナは、BeanFactory、ApplicationContext、Core containerとも呼ばれます。
コンテナは、オブジェクト生成、設定、初期化メソッドの呼び出し、登録されたコールバックオブジェクトへのオブジェクトの受け渡しなど、多くの責務と拡張ポイントを持っています。これらの機能は、オブジェクトのライフサイクル形成に深く関わっており、コンテナの提供する最も重要な機能の一つです。
コンテナによって生成されるオブジェクトは「Managed Objects」または「Beans」と呼ばれます。通常、Bean定義を含むXMLファイルをロードすることでコンテナは設定を行います。これらのファイルには、オブジェクト生成に必要な全ての情報が含まれており、エラーが発生しなければ、オブジェクトは利用可能な状態になります。
オブジェクトを取得するには、「依存性の参照」または「依存性の注入」を行います。「依存性の参照」は、呼び出し側がコンテナに名前や型を指定してオブジェクトを問い合わせるパターンです。「依存性の注入」は、コンテナがコンストラクタ、プロパティ、ファクトリメソッドを通じて、他のオブジェクトにオブジェクトを渡すパターンです。
コンテナを使用せずにSpring Frameworkの他の部分だけを使用することも可能ですが、コンテナを利用することで、アプリケーションの設定とカスタマイズが容易になります。Springコンテナは、一貫したアプリケーション設定機構を提供し、小規模から大規模まで、ほぼすべての環境で機能します。
アスペクト指向プログラミング (AOP) フレームワーク
Spring Frameworkには、独自のAOPフレームワークがあります。これは、アスペクトにおけるクラス間の横断的な関心事のモジュール化を可能にします。Spring AOPフレームワークは、Springコンテナを最大限に活用しており、実行時に設定されるため、コンパイル時やロード時の織り込みは不要です。ただし、横取り方式のため、ジョイントポイントにあるオブジェクトのpublicまたはprotectedメソッドしか対象にできません。
Spring AOPはAspectJと比較すると機能は限定的ですが、単純です。Spring 1.2ではAspectJのアスペクトをコンテナ内で設定でき、Spring 2.0ではAspectJとの連携が強化されています。Spring AOPは、Spring Framework自体の横断的関心事にも機能し、コンテナで生成および設定された任意のオブジェクトの質を向上させることができます。
Spring Frameworkは、トランザクション管理、セキュリティ、リモートアクセス、JMXなどでSpring AOPを利用しています。
Spring 2.0以降では、AOPの設定方法としてスキーマベースの手法と@AspectJベースのアノテーションスタイルが提供されています。Springチームは新しいAOP関連用語を導入しないことを決定し、SpringのドキュメントではAspectJなどと同じ用語を使用しています。
データアクセスフレームワーク
Springのデータアクセスフレームワークは、アプリケーションがデータベースを利用する際に開発者が直面する課題を解決します。JDBC、iBATIS、
Hibernate、JDO、JPA、Oracle TopLink、Apache Ojb、Apache Cayenneなど、Javaにおける主要なデータアクセスフレームワークをすべてサポートしています。
Springは、これらのフレームワークに対して以下の機能を提供します。
- - リソース管理: データベースリソースの自動的な獲得と解放。
- - 例外処理: データアクセス時の例外をSpringのデータアクセス階層に変換。
- - トランザクション参加: 実行中のトランザクションへの参加。
- - リソース・アンラッピング: コネクションプールラッパーからデータベースオブジェクトを取り出す。
- - BLOBおよびCLOB処理の抽象化
これらの機能は、Springが各フレームワーク用に提供するTemplateクラスを使用することで利用できます。Springは
HibernateとJPAのAPIを直接使用することも可能にしましたが、その場合は上記の機能が提供されないため、アプリケーション側で処理する必要があります。
Springのトランザクション管理とともにデータアクセスフレームワークを使用することで、様々なデータアクセスフレームワークの柔軟な抽象化が可能になります。Spring Frameworkは共通のデータアクセスAPIを提供せず、サポートするAPIをほぼそのまま使用できるようにしています。
トランザクション管理フレームワーク
Springのトランザクション管理フレームワークは、
Javaプラットフォームに抽象化機構を提供します。これにより、ローカルトランザクションとグローバルトランザクションの抽象化、ネストされたトランザクションの抽象化、トランザクションのセーフポイントの抽象化が可能になります。ほとんどすべての
Javaプラットフォーム環境で利用できます。JTAと比較すると、JTAはネストとグローバルトランザクションのみをサポートしており、
アプリケーションサーバーが必須です。
Spring Frameworkには、JDBC Connection、
オブジェクト関係マッピングのUnits of Work、JTAのTransactionManagerとUserTransactionなど、様々なトランザクション管理戦略のためのPlatformTransactionManagerが用意されています。
このフレームワークは、トランザクション管理機能をアプリケーションに付与するための2つの方法を提供します。一つはSpringのTransactionTemplateを使うプログラミングによる方法、もう一つはXMLまたはJava 5のアノテーションのような
メタデータを使った設定による方法です。
Springのデータアクセスフレームワークとともに使用することで、JTAやEJBを使わずにトランザクションシステムの設定が可能になり、
Java Message Serviceやキャッシュエンジンとも連携できます。
Model-View-Controller (MVC) フレームワーク
Spring Frameworkには、独自のMVCフレームワークがあります。これは、
Apache Struts Webフレームワークへの失望と、他のフレームワークでは不足していた機能を補うために開発されました。Spring MVCは、リクエストベースのフレームワークであり、最近のリクエストベースのフレームワークで必須となっているすべての責務についてStrategyインターフェイスを定義しています。
DispatcherServletクラスは、フレームワークのフロントコントローラーパターンであり、HTTPリクエストの処理中に各種インターフェイスに制御を委譲します。
Spring MVCで定義されている重要なインターフェイスには、HandlerMapping、HandlerAdapter、Controller、View、ViewResolver、HandlerInterceptor、LocaleResolver、MultipartResolverなどがあります。
これらのインターフェイスは、フレームワーク全体で重要な役割を果たし、広範囲なバリエーションの実装が可能です。Spring MVCにはこれらのインターフェイスの実装も含まれていますが、開発者やベンダーは新しい実装を書くこともできます。Spring MVCは、Javaのjava.util.MapインターフェイスをModelのデータ指向抽象化として使用しています。
DispatcherServletは、Spring IoCコンテナと密接に結合しており、アプリケーションのWeb層の設定を可能にします。しかし、Spring Frameworkの他の部分を使ったアプリケーションではSpring MVCを使用しないという選択も可能です。Spring MVCはSpringコンテナをコンフィギュレーションと組み立てに使用しているため、WebベースのアプリケーションではIoC機能の利点を最大限に活用できます。
リモートアクセスフレームワーク
Springのリモートアクセスフレームワークは、
Javaプラットフォームで利用可能なRPCベースの様々な技術を抽象化し、クライアント接続とサーバー間のオブジェクトのエクスポートの両方で使用できます。特に重要なのは、IoCとAOPの組み合わせによって、これらの技術の設定と利用が可能な限り容易になる点です。
このフレームワークは、障害復旧(接続障害後の自動再接続)と、クライアント側のEJBリモートステートレスセッションBeanの最適化も提供します。Springは、HTTPベースのプロトコル、Hessian、RMI、RMI-IIOP(CORBA)、
Enterprise JavaBeansクライアント接続、SOAPなど、様々なプロトコルと製品との接続をサポートしています。
SpringのリモートアクセスフレームワークがサポートするRPCスタイルのプロトコルや製品について、クライアントもサーバーも設定をSpring Coreコンテナで行うことができます。代替のオープンソース実装としてCluster4Springがあり、これは一対一、一対多、動的サービス発見など、様々な構成をサポートします。
Springの
バッチ処理フレームワークは、2008年4月に公式版がリリースされたモジュールで、大量データの一括処理を行うことができます。InfrastructureとCoreの2つのモジュールで構成されています。Ver1.0はJava1.4のシングルプロセス・マルチスレッドをターゲットにしていましたが、Ver2.0からはJava1.5以上での動作となり、マルチプロセスにも対応しました。