Когда использовать Qualifier и Primary весной - PullRequest
1 голос
/ 18 июня 2019

Я прочитал, что @Qualifier может использоваться на этапе внедрения, тогда как @Primary используется на этапе настройки.До сих пор неясно, когда использовать.

Также у меня есть следующие сомнения:

  • Можно ли использовать @Primary и @Qualifier вместе?если да, имеет ли @Qualifier приоритет?

  • можно ли @Primary использовать с @Autowired?

  • Чем фаза впрыска отличается от фазы конфигурацииЭто в отношении бобов весны

Ответы [ 2 ]

1 голос
/ 18 июня 2019

@Primary указывает на то, что бобу должно быть отдано предпочтение, когда несколько кандидатов квалифицированы для автоматической передачи однозначной зависимости.

@Qualifier указывает, что конкретный бин должен быть автоматически подключен при наличии нескольких кандидатов.

Например, у нас есть два bean-компонента, реализующих один и тот же интерфейс.

public interface BeanInterface {

    String getName();
}

public class Bean1 implements BeanInterface {
    @Override
    public String getName() {
        return "bean 1";
    }
}

public class Bean2 implements BeanInterface {
    @Override
    public String getName() {
        return "bean2";
    }
}

Вот наш сервис.

@Service
public class BeanService {

    @Autowired
    private BeanInterface bean;
}

И наша конфигурация.

@Configuration
public class Config {

    @Bean("bean1")
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

Когда запускается Spring, он обнаруживает, что два bean-компонента ("bean1" и "bean2") оба могут быть автоматически подключены к BeanService, поскольку они реализуют один и тот же интерфейс BeanInterface.Он сообщает об ошибке в моем Идеале.

Could not autowire. There is more than one bean of 'BeanInterface' type.
Beans: bean1   (Config.java) 
bean2   (Config.java) 

И без подсказки Spring не знает, какой использовать.

Так что в нашем случае, когда мы добавляем @Primary к Config.bean1(),

@Bean("bean1")
@Primary
public BeanInterface bean1() {
    return new Bean1();
}

В сообщении Spring говорится: «Когда вы обнаружите, что несколько бобов могут быть оба автоматически подключены, используйте основной в качестве первого выбора».Итак, Spring выберет bean1 для автоматического подключения к BeanService.

Вот еще один способ автоматического подключения bean1 к BeanService с использованием @Qualifier в BeanService.class.

@Service
public class BeanService {

    @Autowired
    @Qualifier("bean1")
    private BeanInterface bean;
}

@Qualifier скажет Spring: «Независимо от того, сколько бобов вы нашли, просто используйте тот, который я вам говорю. »

Так что вы можете найти оба @Qualifierи @Primary говорят Spring использовать конкретный компонент, когда несколько кандидатов имеют право на автоматическую передачу.Но @Qualifier более конкретен и имеет высокий приоритет.Таким образом, когда найдены и @Qualifier, и @Primary, @Primary будет игнорироваться.

Вот тест.

@Configuration
public class Config {

    @Bean("bean1")
    @Primary
    public BeanInterface bean1() {
        return new Bean1();
    }

    @Bean("bean2")
    public BeanInterface bean2() {
        return new Bean2();
    }
}

@Service
public class BeanService {

    @Autowired
    @Qualifier("bean2")
    private BeanInterface bean;

    @PostConstruct
    public void test() {
        String name = bean.getName();
        System.out.println(name);
    }
}

Выход "bean2".

0 голосов
/ 18 июня 2019

Да, @Qualifier имеет преимущество.Да, мы можем использовать @Primary и @Autowired вместе.

@ Класс конфигурации, связанный с контекстом приложения, который будет использоваться для настройки конфигурации уровня приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...