2012年3月18日日曜日

component-scan と Stereotypeアノテーション


オブジェクト同士の依存性をコンストラクター引数、ファクトリーメソッドへの引数、インスタンスにセットされるプロパティといった形で注入するプロセスを Spring Framework では“IoC(Inversion of Control)”と呼んでいます。一般に“DI(dependency injection)”という呼び名で知られているこの機能を実現しているのが“IoC Container”です。

詳しくは、リファレンスの 4. The IoC Container に書かれていますが、Spring におけるビーンとは、IoC Containerによりインスタンス化され、組み立てられるオブジェクトで、そうした IoC Container の基本機能を提供するのが BeanFactory インターフェースや、そのサブインターフェースである ApplicationContext インターフェースです。

Container は、XML やソース中に記述されたアノテーションで定義されたメタデータに基づきビーンのインスタンス化、構成、組み立てを行いアプリケーションを構築します。

前回の「Controller と Handler Mapping」で、URL とコントローラーの紐付けを行いました。今回は Container にコントローラークラスを自動検出させる設定を [servlet-name]-servlet.xml とソースに施します。

context:component-scan
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  :
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  :
 中 略
  :
 <context:component-scan base-package="picboo"/>
  :
 中 略
  :

まず、servlet.xml に context:component-scan を追加し、base-package にスキャンの開始点となるクラスパスを指定します。後は、このパス階層の中に必要なクラスを作っていくだけです。

stereotypeアノテーション
package picboo.controller;
  :
import org.springframework.stereotype.Controller;
  :

@Controller
public class AccountController {
  :
}

上のソースは AccountControler.java の一部です。public class AccountController{...}の先頭に@Controller アノテーションが付いています。こうすることで Container は、context:component-scan で指定されたクラスパス階層から、コントローラークラスを自動検出できるようになります。

同様に FrontController, WelcomeController, AjaxAccountController にも、@Controller アノテーションを記述します。

この @Controller アノテーションは、stereotype アノテーションの一つで、このほかに @Service, @Repository, @Component があります。今回使用した @Controller、および @Service, @Repository は、それぞれ @Component アノテーションをコントローラー、サービス、DAO(Data Access Object)向けに特化したものです。

@Controller とアノテートされているクラスは「コントローラー」だよ、というまさにステレオタイプな関連付けを Container に行わせるのが stereotype アノテーション というわけです。

0 件のコメント:

コメントを投稿