春の@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 アノテーションについて学びました。コード例を使用して、[email protected]の必要性と使用例を示しました。

いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-all[GitHubプロジェクトについて]で利用可能です。

前の投稿:IntelliJのデバッグトリック
次の投稿:Javadocの紹介