liguofeng29’s blog

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

自動バインディング

DIの指定を省略した場合、 コンポーネント間の依存関係は、 型および名前によってS2Containerが自動的に解決します。 componentタグのautoBinding属性を指定することで細かく制御することもできます。

 

autoBinding説明
auto(default) コンストラクタとプロパティの自動バインディングが適用されます。
semiauto アノテーションなどで明示的に指定したプロパティに対して自動バインディングが適用されます。
constructor コンストラクタの自動バインディングが適用されます。
property プロパティの自動バインディングが適用されます。
none 自動バインディンは適用されません。
コンストラクタ・インジェクションの自動バインディング
1. コンストラクタ・インジェクションが明示的に指定されている場合、 自動バインディングは適用されません。
2. デフォルトコンストラクタが定義されている場合、自動バインディングは適用されません。
3. 引数の型がすべてインタフェースで、最も引数の多いコンストラクタに自動バインディングは適用される。

プロパティ・インジェクションの自動バインディグ

1. セッター・インジェクションが明示的に指定されている場合、 自動バインディングは適用されません。
2. プロパティ型の一致するコンポーネントが登録されてあり、プロパティ名とコンポーネント名が同じの場合、自動バインディグされる。
3. プロパティ型がインタフェイスの場合、インタフェースの実装したコンポーネントがあれば、自動バインディグされる。
複数実装の場合、エラーが発生する。
4. プロパティ型がインタフェイスの配列場合、インタフェースの実装したコンポーネントがあれば、配列が自動バインディグされる。

 

プロパティ・インジェクションの自動バインディグ-2の例

app.dicon
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 
<components>
  <include path="convention.dicon"/>
  <include path="aop.dicon"/>
 
     <!-- コンポーネント定義 -->
     <!-- 自動バインディング = property -->
    <component name="autoDI" class="AutoDI" instance="singleton" autoBinding="property" />
 
    <component name="message1" class="java.lang.String" instance="singleton" autoBinding="auto">
     <arg>"メッセージ1です。"</arg>
    </component>
 
    <component name="message2" class="java.lang.String" instance="singleton" autoBinding="auto">
     <arg>"メッセージ2です。"</arg>
    </component>
 
</components>
 

 

AutoDI.java
public class AutoDI  {
 
    private String message1;
 
    // publicの場合、setterは不要。
    public String message2;
 
    // セッター
    public void setMessage1(String message1) {
        this.message1 = message1;
    }
 
    public String getMessage1() {
        return this.message1;
    }
 
    public String getMessage2() {
        return this.message2;
    }
 
}

 

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();
 
        // コンポーネント取得
        FieldDI fieldDI = SingletonS2Container.getComponent("fieldDI");
        System.out.println(fieldDI.getMessage());
 
        // S2Container破棄
        SingletonS2ContainerFactory.destroy();
    }
}
 

 

出力メッセージ
メッセージ1です。
メッセージ2です。

 

propertyタグのbindingType属性で、プロパティごとに細かく制御することもできます。

bindingType説明
must 自動バインディングが適用されない場合、例外が発生します。
should(default) 自動バインディングが適用されない場合、警告を通知します。
may 自動バインディングが適用されない場合、何もおきません。
none 自動バインディングは適用されません。