[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-dlya-chego-nuzhny-qualifier-i-primary":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},614,"dlya-chego-nuzhny-qualifier-i-primary",14,"spring","Spring","🌱","Для чего нужны @Qualifier и @Primary?","`@Qualifier` и `@Primary` решают проблему неоднозначности, когда в контейнере есть несколько бинов одного типа.\n\n`@Qualifier` -- указывает конкретное имя бина для внедрения. `@Primary` -- помечает бин как «предпочтительный» по умолчанию. Приоритет: `@Qualifier` > `@Primary` > совпадение по имени > ошибка.\n\n\u003Cdetails>\n\u003Csummary>Пример использования @Qualifier и @Primary\u003C\u002Fsummary>\n\n```java\npublic interface NotificationService {\n    void send(String message);\n}\n\n@Service(\"emailNotification\")\n@Primary \u002F\u002F будет внедряться по умолчанию\npublic class EmailNotificationService implements NotificationService {\n    public void send(String message) { \u002F* отправка email *\u002F }\n}\n\n@Service(\"smsNotification\")\npublic class SmsNotificationService implements NotificationService {\n    public void send(String message) { \u002F* отправка SMS *\u002F }\n}\n\n@Service\npublic class OrderService {\n    \u002F\u002F Внедрится EmailNotificationService, т.к. он @Primary\n    public OrderService(NotificationService notificationService) { }\n}\n\n@Service\npublic class AlertService {\n    \u002F\u002F Явно выбираем SMS, несмотря на @Primary\n    public AlertService(@Qualifier(\"smsNotification\") NotificationService notificationService) { }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Внедрение всех реализаций\n\n```java\n@Service\npublic class NotificationManager {\n    private final List\u003CNotificationService> services;\n\n    \u002F\u002F Spring внедрит ВСЕ бины типа NotificationService\n    public NotificationManager(List\u003CNotificationService> services) {\n        this.services = services;\n    }\n}\n```\n\n### Собственный квалификатор (лучшая практика)\n\n```java\n@Qualifier\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})\npublic @interface Email { }\n\n@Service\n@Email\npublic class EmailNotificationService implements NotificationService { }\n\n\u002F\u002F Использование -- проверяется на этапе компиляции:\npublic OrderService(@Email NotificationService notificationService) { }\n```\n\n> **На собеседовании:** важно знать приоритет разрешения и когда использовать что. Частая ошибка -- использовать строковые значения в `@Qualifier` вместо собственных аннотаций-квалификаторов (строки не проверяются при компиляции).","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Для чего нужны @Qualifier и @Primary? — Gymterview","`@Qualifier` и `@Primary` решают проблему неоднозначности, когда в контейнере есть несколько бинов одного типа.",[7,13],true]