結論
inject 先のフィールド名を Bean 名に合わせるだけで OK。
前提
Example
を実装した Bean が 2 つ存在しているとする。
@Coponent
public ExampleImplA implements Example {
......
}
@Coponent
public ExampleImplB implements Example {
......
}
こんな感じで実行すると当然エラーが発生する。
// Example 型の bean を使用
@Component
@RequiredArgsConstructor
public class BeanConsumer {
private final Example example;
......
}
......
BeanConsumer required a single bean, but 2 were found
.....
Consider marking one of the beans as @Primary,
updating the consumer to accept multiple beans,
or using @Qualifier to identify the bean that should be consumed
......
エラーメッセージの通りに @Primary
や @Qualifier
を使って解決できるが、今回は別な方法を試す。
解決策
利用先のフィールド名を Bean 名に合わせればよい。
例えば ExampleImplA
を inject する場合、Bean 名はデフォルトで exampleImplA
となるので以下のようにすればよい。
// Example 型の bean を使用
@Component
@RequiredArgsConstructor
public class BeanConsumer {
private final Example exampleImplA;
}
Appendix
動作環境
SpringBoot 3.1.0
注意事項
テスト時に Spy できません。
例えば以下のように Spy しようとすると...
@Component
@RequiredArgsConstructor
public class BeanConsumerTest {
@SpyBean Example exampleImplA;
}
以下のエラーが出る。
java.lang.IllegalStateException: No bean found for definition ......
Spy するには @Qualifier
をつける必要がある。