今回は、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がインジェクションされます。
