春の@Primaryアノテーション
1概要
このクイックチュートリアルでは、フレームワークのバージョン3.0で導入されたSpringの
@ Primary
アノテーションについて説明します。
簡単に言うと、** 同じタイプのBeanが複数ある場合は、
@ Primary
を使用してBeanを優先します。
問題を詳しく説明しましょう。
2なぜ
@ Primary
が必要なのですか?
場合によっては、** 同じタイプのBeanを複数登録する必要があります。
この例では、
Employee
タイプの
JohnEmployee()
および
TonyEmployee()
Beanがあります。
@Configuration
public class Config {
@Bean
public Employee JohnEmployee() {
return new Employee("John");
}
@Bean
public Employee TonyEmployee() {
return new Employee("Tony");
}
}
-
アプリケーションを実行しようとすると、Springは
NoUniqueBeanDefinitionException
をスローします。
同じ型のBeanにアクセスするには、通常
@ Qualifier(“ beanName”)
注釈を使用します。
@ Autowired
と共にインジェクションポイントでそれを適用します。今回のケースでは、構成段階でBeanを選択しているので、ここでは@ @ Qualifier
を適用できません。
link
に従うことで、
@ Qualifier__アノテーションの詳細を知ることができます。
この問題を解決するために、Springは
@ Primary
アノテーションを提供しています。
3
@ Bean
で
@ Primary
を使用する
設定クラスを見てみましょう。
@Configuration
public class Config {
@Bean
public Employee JohnEmployee() {
return new Employee("John");
}
@Bean
@Primary
public Employee TonyEmployee() {
return new Employee("Tony");
}
}
-
TonyEmployee()
Beanを
@ Primary
でマークします。 Springは
JohnEmployee()
よりも優先して
TonyEmployee()
Beanを注入します
それでは、アプリケーションコンテキストを起動し、そこから
Employee
Beanを取得しましょう。
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(Config.class);
Employee employee = context.getBean(Employee.class);
System.out.println(employee);
アプリケーションを実行した後:
Employee{name='Tony'}
-
出力から、自動配線中に
__TonyEmployee()
__instanceが優先されることがわかります。
4
@ Primary
を
@ Component
と併用する
-
@Primaryを直接Beanに使用できます** 。次のシナリオを見てみましょう。
public interface Manager {
String getManagerName();
}
Manager
インターフェースと2つのサブクラスBean、
DepartmentManager
があります。
@Component
public class DepartmentManager implements Manager {
@Override
public String getManagerName() {
return "Department manager";
}
}
そして
GeneralManager
bean:
@Component
@Primary
public class GeneralManager implements Manager {
@Override
public String getManagerName() {
return "General manager";
}
}
両方とも
Manager
インターフェースの
getManagerName()
をオーバーライドします。
また、
__GeneralManager
beanに
@ Primary__というマークを付けます。
今回は、**
@ Primary
は、コンポーネントスキャンを有効にした場合にのみ意味があります。
@Configuration
@ComponentScan(basePackages="org.baeldung.primary")
public class Config {
}
正しいBeanを見つけながら、依存性注入を使用するサービスを作成しましょう。
@Service
public class ManagerService {
@Autowired
private Manager manager;
public Manager getManager() {
return manager;
}
}
ここでは、両方のBean
__DepartmentManager
と
GeneralManager__が自動配線に適しています。
-
__GeneralManager
beanに
@ Primary__を付けたので、依存性注入のために選択されます** :
ManagerService service = context.getBean(ManagerService.class);
Manager manager = service.getManager();
System.out.println(manager.getManagerName());
出力は「__一般マネージャ」です。
5結論
この記事では、Springの
@ Primary
アノテーションについて学びました。コード例を使用して、__@Primaryの必要性と使用例を示しました。
いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[GitHubプロジェクトについて]で利用可能です。