@Qualifierと@Primaryアノテーションについて

今回は、QualifierアノテーションとPrimaryアノテーションについてみていきたいと思います。

どこで使う?

Springで開発を行なっているときに同じ型のBeanを定義し、使い分ける時があります。そのときに使用するアノテーションです。


@Configuration
public class WebConfiguration {

  @Bean
  public PasswordEncoder sCryptPasswordEncoder() {
    return new SCryptPasswordEncoder();
  }

  @Bean
  public PasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
  }
}
@RestController
@RequestMapping("/api")
public class HomeController {

  @Autowired
  PasswordEncoder passwordEncoder;
}

上記のように「passwordEncoder」を返却するBeanが2つあるとします。

この状態で実行すると以下のエラーメッセージが表示されます。

Field passwordEncoder in 。。。。required a single bean, but 2 were found:
	- sCryptPasswordEncoder: defined by method 'sCryptPasswordEncoder' in class path resource 。。。。
	- bCryptPasswordEncoder: defined by method 'bCryptPasswordEncoder' in class path resource 。。。。

「PasswordEncoder」のBeanは必ず1つである必要があるが、2つが見つかったというエラーメッセージです。Qualifierアノテーション「PasswordEncoder」のBeanは必ず1つである必要があるが、2つが見つかったというエラーメッセージです。

Qualifierアノテーション

Beanが複数存在している場合、Qualifierアノテーションを使ってBeanの名前を指定することができます。

@RestController
@RequestMapping("/api")
public class HomeController {

  @Autowired
  @Qualifier("bCryptPasswordEncoder")
  PasswordEncoder passwordEncoder;
}
@RestController
@RequestMapping("/api")
public class HomeController {

  @Autowired
  @Qualifier("sCryptPasswordEncoder")
  PasswordEncoder passwordEncoder;
}

上記のようにBean名を指定することで正常に実行ができます。

ただ、必ず指定しなければならない。忘れて指定してない場合エラーになるというのがあります。

そのときにDefaultでBeanを指定するアノテーションがPrimaryアノテーションです。

Primaryアノテーション

同じ型のBeanが複数存在する場合、Default Beanを指定するときに使われます。

@Configuration
public class WebConfiguration {

  @Bean
  public PasswordEncoder sCryptPasswordEncoder() {
    return new SCryptPasswordEncoder();
  }

  @Bean
  @Primary
  public PasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
  }
}
@RestController
@RequestMapping("/api")
public class HomeController {

  @Autowired
  PasswordEncoder passwordEncoder;
}

上記のサンプルでは「bCryptPasswordEncoder」をDafault Beanとして指定しています。なので、「HomeController.passwordEncoder」フィルドには「bCryptPasswordEncoder」Beanがインジェクションされます。

コメントを残す