Spring: 実装されたクラスではなくインターフェースを自動配線するのはなぜですか? 質問する

Spring: 実装されたクラスではなくインターフェースを自動配線するのはなぜですか? 質問する

interface IA
{
  public void someFunction();
}

@Resource(name="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}

@Resource(name="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{

  @Autowire
  @Qualifier("b") 
  IA worker;

  worker.someFunction();
}

誰か私にこれを説明してくれませんか。

  • Spring はどのポリモーフィック型を使用するかをどのように認識するのでしょうか。
  • @Qualifierまたは が必要ですか@Resource?
  • 実装されたクラスではなくインターフェースを自動配線するのはなぜですか?

ベストアンサー1

Spring はどのポリモーフィック型を使用するかをどのように認識するのでしょうか。

インターフェースの実装が 1 つだけあり、その実装に@ComponentSpring のコンポーネント スキャンが有効になっているという注釈が付けられている限り、Spring フレームワークは (インターフェース、実装) のペアを見つけることができます。コンポーネント スキャンが有効になっていない場合は、application-config.xml (または同等の Spring 構成ファイル) で Bean を明示的に定義する必要があります。

@Qualifier または @Resource は必要ですか?

複数の実装がある場合は、それぞれを修飾する必要があり、自動配線中に、アノテーション@Qualifierとともに適切な実装を注入するためにアノテーションを使用する必要があります。@Resource (J2EE セマンティクス) を使用している場合は、このアノテーションの属性を@Autowired使用して Bean 名を指定する必要があります。name

実装されたクラスではなくインターフェースを自動配線するのはなぜですか?

まず、一般的にインターフェースにコーディングすることは常に良い習慣です。次に、Spring の場合、実行時に任意の実装を挿入できます。典型的な使用例は、テスト段階でモック実装を挿入することです。

interface IA
{
  public void someFunction();
}


class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

Bean の構成は次のようになります。

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

あるいは、これらが存在するパッケージでコンポーネント スキャンを有効にした場合は、各クラスを@Component次のように修飾する必要があります。

interface IA
{
  public void someFunction();
}

@Component(value="b")
class B implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someBfunc()
  {
     //doing b things
  }
}


@Component(value="c")
class C implements IA
{
  public void someFunction()
  {
    //busy code block
  }
  public void someCfunc()
  {
     //doing C things
  }
}

@Component    
class MyRunner
{
     @Autowire
     @Qualifier("b") 
     IA worker;

     ....
     worker.someFunction();
}

次に、型のインスタンスが に注入されworkerます。MyRunnerB

おすすめ記事