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プロジェクトについて]で利用可能です。