Springはどのポリモーフィック型を使用するかをどのようにして知るのですか?
インターフェイスの実装が1つしかなく、その実装に@Component
Springのコンポーネントスキャンが有効になっているアノテーションが付けられている限り、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
、MyRunner
タイプのインスタンスが注入されますB
。