liguofeng29’s blog

個人勉強用ブログだっす。

Dependency Injectionタイプその3 - メソッド・インジェクション

 メソッドにDIを行なうのがメソッド・インジェクションです。

コンポーネントメソッドには、componentタグの子タグであるinitMethodタグを使って指定します。
メソッド名はname属性で指定します。
initMethodタグの子タグであるargタグで引数を指定することや、name属性を省略してボディでOGNL式を使うこともできます。

 

app.dicon
 
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 
<components>
  <include path="convention.dicon"/>
  <include path="aop.dicon"/>
 
     <!-- コンポーネント定義 -->
    <component name="methodDI" class="MethodDI" instance="singleton">
      <!-- インスタンス生成後に実行するメソッド複数指定できる -->
      <!-- パラメタが必要な場合はargタグ -->
      <initMethod name="addMessage">
        <arg>"メソッドDIの第一メソッド"</arg>
      </initMethod>
 
      <initMethod name="addMessage">
        <arg>"メソッドDIの第二メソッド"</arg>
      </initMethod>
 
      <initMethod name="addMessage">
        <arg>"メソッドDIの第三メソッド"</arg>
      </initMethod>
    </component>
 

 

MethodDI.java
import java.util.ArrayList;
import java.util.List;
public class MethodDI  {
 
    private List<String> messageList = new ArrayList<String>();
 
    // DIメソッド
    public void addMessage(String message) {
        messageList.add(message);
    }
 
    // 出力
    public String getMessageList() {
 
        StringBuilder sb = new StringBuilder();
 
        for(String s : this.messageList) {
            sb.append(s);
            sb.append("\r\n");
        }
 
        return sb.toString();
    }
}

 

TestClass.java
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
 
public class TestClass {
 
    public static void main(String[] args) {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
 
        // コンポーネント取得
        MethodDI methodDI = SingletonS2Container.getComponent("methodDI");
        System.out.println(methodDI.getMessageList());
 
        // S2Container破棄
        SingletonS2ContainerFactory.destroy();
    }
}
 

 

出力メッセージ