171

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

3 に答える 3

254

Springは、使用するポリモーフィックタイプをどのようにして知るのでしょうか。

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

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

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

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

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

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、inMyRunnerにタイプのインスタンスが注入されますB

于 2012-10-15T15:57:35.983 に答える
1

また、Cglib2AopProxyメソッドをプロキシできないなどの警告がログに表示される場合があります。そして、これに関する他の多くの理由がここで説明されていますなぜサービス層とdao層に常に単一の実装インターフェースがあるのですか?

于 2015-09-22T11:29:38.893 に答える
0

@Autowired後処理であるため、.XML構成ファイルで次のBeanを宣言した場合にのみ機能しました。

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>
于 2022-02-05T22:06:00.423 に答える