[解決済み] 春です。なぜ実装されたクラスではなくインターフェイスを自動配線するのか?
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();
}
次に
worker
で
MyRunner
のインスタンスが注入されます。
B
.
関連
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] Spring Frameworkの@Injectと@Autowiredの違いは何ですか?どのような条件でどちらを使うか?
-
[解決済み] 同じインタフェースを実装する2つのビーンを自動配線する - 自動配線するデフォルトのビーンを設定する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
[解決済み] Serviceアノテーションはどこにつけるべきですか?インターフェースか実装か?