@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".