[Seasar-user:2128] Re: injectDependencyについて

Masataka Kurihara kurihara
2005年 6月 7日 (火) 09:57:44 JST


栗原です。

> 最初の方で提案のあった final を外す・private を protected に
> といったあたりは私のワークスペース上では修正済みです.
> 一通り完結したらコミットします.

  ありがとうございます。これは今回の話の中で一番お願いしたい
ところ、重要なところなのでうれしいです。

> NullComponentDef を導入してしまうと,S2Container#getComponentDef() の
> 仕様が現在と変わってしまうということを [Seasar-user:2102] で
> 書いているのですが?

このNullComponentDef(仮称)の登場は、[2108]でhasComponentDef()の
存在の指摘([2102])により、S2Container#injectDependency()にもってくよ
うに、仮に考えています。再掲すると、[2108]の

public void injectDependency(
    Object outerComponent, Class componentClass) {
  ComponentDef def;
  if(hasComponentDef(componentClass)) {
    def = getComponentDef(componentClass);
  } else {
    def = NullComponentDef.getInstance();
  }
  def.injectDependency(outerComponent);
}

で、このNullComponentDef.getInstance();ですが、特にNullComponentDef
をComponentDefImplから継承してオーバーライドしなければ、
ComponentDefImpl:
public void injectDependency(Object outerComponent) {
  getComponentDeployer().injectDependency(outerComponent);
}
というコードを通り、
private synchronized ComponentDeployer getComponentDeployer() {
というメソッドに。ここで、ComponentDeployerFactory.create(this);という
コードに現行はなってますが、ファクトリを一度、
ComponentDeployerFactory.getDefaultFacotory().create(this);
とかなんとかしてシングルトンのファクトリを通します。ここでいう「this」は、
NullComponentDefなので、ファクトリの中で型をチェックして処理を行い、
インジェクション処理を行います。S2標準では、このNullComponentDefが
入ってきたところで、ComponentNotFoundを出せば、同じコールスタックな
のでAPI的には挙動が同じになります。
ComponentDeployerFactoryファクトリを、あらかじめアプリケーションのstatic
イニシャライザなどで、
static {
  ComponentDeployerFactory.setDefaultFactory(new HogeFactory());
}
のように、してカスタマイズする感じです。

--
株式会社グルージェント
栗原 傑享(くりはら まさたか)
渋谷区渋谷3-7-6 第6矢木ビル4F
TEL:03-5469-8869 FAX:03-5469-8879
URL:http://www.gluegent.com/
--

> NullComponentDef を導入してしまうと,S2Container#getComponentDef() の
> 仕様が現在と変わってしまうということを [Seasar-user:2102] で
> 書いているのですが?
> # 正確に言うと,コンポーネントが見つからない場合に 
> # S2Container#getComponentDef() が NullComponentDef を返すように
> # すると現在の仕様と異なってしまうということ.
> # これは S2ContainerImpl なのでカスタマイズされたコードの話じゃないよね?
> 
> 「今のS2の見え方は全然変らない」のなら反対しない (かもしれない)
> のですが,そうじゃないからまずいのではないかという話なのですが...
> やっぱり読み違えてる??
> 
> 現在の S2Container#getComponentDef() は,該当するコンポーネント
> 定義が存在しない場合例外をスローします.これは S2 内の実装の話では
> なくて,S2Containert というインタフェースの仕様です.
> まさたかさんの [Seasar-user:2108] の内容はそれを変更して
> NullComponentDef を返すというもので,「今のS2の見え方は全然変らない」
> というものではないように思えます.
> 私には,まさたかさんは S2Container#getComponentDef() を S2 内の
> 実装として使われているに過ぎなくて,パブリックなインタフェースだと
> 考えていないように見えるのですが...
> 私がどこか勘違いしているでしょうか?
> 
> 
> -- 
> <signature>
>     <name>Koichi Kobayashi</name>
>     <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
> </signature>






Seasar-user メーリングリストの案内