LoginSignup
6
0

複数の同型の Bean がある場合に @Qualifier や @Primary を使用せず inject する

Last updated at Posted at 2023-12-01

結論

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 をつける必要がある。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0