[Seasar-user:6337] Re: [Seaser2] ユーティリティクラスのDI方法について
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2007年 3月 1日 (木) 02:00:09 JST
小林 (koichik) です.
Date: Sun, 25 Feb 2007 15:12:52 +0900
From: "Takuya Aono" <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:6333] Re: [Seaser2] ユーティリティクラスのDI方法について
> > せめて,SingletonS2ContainerFactory を使用し,個別に
> > コンテナを作成しないようにすべきだと思います.
>
> おっやるとおりだと思います。
> 勉強不足で、diconでsigleton指定していました。
> 修正しようと思います。
dicon で指定する instance=singleton というのは,
そのコンテナ内でコンポーネントのインスタンスが
一つしか作成されないという意味になります.
SingletonS2Container というのは,一つのコンテナを
扱うためのもので,同じシングルトンという用語を
使っていても単位が違うのでご注意ください.
例えば
public final class Util1 {
static Strategy strategy = null;
static{
S2Container continer = S2ContainerFactory.create( configFilepath );
strategy = (Strategy)continer.getComponent( parserName );
}
}
public final class Util2 {
static Strategy strategy = null;
static{
S2Container continer = S2ContainerFactory.create( configFilepath );
strategy = (Strategy)continer.getComponent( parserName );
}
}
とあった場合,Util1 と Util2 は個別のコンテナを作成します.
それぞれが同じ定義ファイルを指定していても,コンテナの
インスタンスは 2 つ作成され,その中の instance=singleton
のコンポーネントも個別に作成されます.
ですから,二つのクラスの strategy は別のインスタンスと
なります.
public final class Util1 {
static Strategy strategy = null;
static{
S2Container continer = SingletonS2ContainerFactory.getContainer();
strategy = (Strategy)continer.getComponent( parserName );
}
}
public final class Util2 {
static Strategy strategy = null;
static{
S2Container continer = SingletonS2ContainerFactory.getContainer();
strategy = (Strategy)continer.getComponent( parserName );
}
}
とした場合は,Util1 と Util2 は同じコンテナを参照します.
ですから,instance=singleton のコンポーネントであれば,
それぞれの strategy は同一のインスタンスとなります.
なお,SingletonS2ContainerFactory を使用する場合は
最初に SingletonS2ContainerFactory#init() を呼び出す
必要があります.
--
<component name="koichik">
<property name="fullName">"Koichi Kobayashi"</property>
<property name="email">"[E-MAIL ADDRESS DELETED]"</property>
<property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>
Seasar-user メーリングリストの案内