1. ホーム
  2. java

[解決済み] 春です。なぜ実装されたクラスではなくインターフェイスを自動配線するのか?

2022-04-22 16:07:28

質問

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 ?
  • なぜ実装されたクラスではなく、インターフェイスを自動配線するのですか?

どのように解決するのですか?

<ブロッククオート

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

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

<ブロッククオート

Qualifierと@Resourceのどちらが必要ですか?

複数の実装がある場合は、それぞれを認定する必要があり、自動配線の際には @Qualifier アノテーションを使用して正しい実装を注入し、さらに @Autowired アノテーションを使用します。もし@Resource (J2EEセマンティクス)を使用している場合は、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();
}

次に workerMyRunner のインスタンスが注入されます。 B .