Springメモ

提供: Astarisk Works Wiki

Spring Frameworkのメモを書いておく。

目次

beanタグによるBeanの登録

Springの基本。

applicationContext.xmlにひとつずつ次の様に定義する。

<bean id="target" class="sample.bean.Target" scope="prototype" />

この例はsample.bean.Targetというクラスをtargetという名前で登録している。 scopeというのはインスタンスのライフサイクル管理の指定で、次の種類がある。

Scope 説明
singleton アプリケーションの開始から終了までのスコープ。つまり、アプリケーション内で一つしかインスタンスが作られない。
prototype
取得されるたびに新しいインスタンスを生成するスコープ。
request
Servlet APIにおけるrequestスコープ。webアプリケーションでのみ利用できる。
session
Servlet APIにおけるsessionスコープ。webアプリケーションでのみ利用できる。
globalSession
Portlet APIにおけるグローバルセッションスコープ

もともとscopeはsingletonとprototypeの概念しかなかったが、Spring2からWebアプリケーションの作成に便利なスコープが追加された。

requestとsessionを利用するにはweb.xmlに次の設定が必要。

<web-app>
  ...
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  ...
</web-app>

依存性の注入

アノテーションによるBeanの登録

beanタグを使って一つずつ定義していけばいいのだが、たとえばStrutsなんかでActionをSpringを使って管理したいときにいちいち登録するのは面倒になる。

で、アノテーションを使ってコンポーネントを自動検出する方法がある。

まず、applicationContext.xmlにはcontext:component-scanタグを指定してコンポーネントの自動検出をするパッケージを指定する。

<context:component-scan base-package="example.bean" />

これでexample.beanパッケージが自動検出対象のパッケージとして指定される。

次に、beanクラスにアノテーションを追加する。

たとえばTargetクラスを登録するには@Componentアノテーションをつける。これで名前が"target"、scopeがprototypeのbeanとして登録される。

@Component
public class Target {
	…省略
}

スコープも指定したい場合には@Scopeアノテーションもつける。また、@Componentアノテーションでbeanの名前を指定することもできる。

次の例はTargetクラスをmyTargetという名前のprototypeスコープのbeanとする場合。

@Component("myTarget")
@Scope("prototype") 
public class Target {
 …省略 
} 

さて、ここまでで、 <bean id="target" class="sample.bean.Target" scope="prototype" />というbeanタグによる定義と同等となった。

まとめると、

  • context:component-scanタグをapplicationContext.xmlに記述してコンポーネントを自動検出するパッケージを指定する。
  • 自動検出されbean登録されたいクラスに@Componentと@Scopeアノテーションを追加する。

さらに

デフォルトでは@Component, @Repository, @Serviceまたは @Controllerアノテーションがついたクラスが自動的に検出される。しかし、これも指定するのが面倒。

個人用ツール