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();
}
}
@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);
}
}
4条答案
按热度按时间zc0qhyus1#
@Primary
表示当有多个候选项符合自动连接单值依赖关系的条件时,应优先选择Bean。@Qualifier
表示当有多个候选对象时,应自动连接特定Bean。例如,我们有两个Bean都实现了相同的接口。
这是我们的服务。
和我们的配置。
当Spring启动时,它会发现有两个bean(“bean1”和“bean2”)都可以自动连接到
BeanService
,因为它们实现了相同的接口BeanInterface
。如果没有提示,Spring不知道该使用哪一个。
在我们的例子中,当我们把
@Primary
加到Config.bean1()
上时。它告诉Spring,“当您发现多个bean都可以自动连接时,请使用主bean作为您的第一个选择。”因此,Spring将选择
bean1
自动连接到BeanService
。下面是另一种将
bean1
自动连接到BeanService
的方法,方法是在BeanService.class
中使用@Qualifier
。@Qualifier
会告诉Spring,“不管你找到了多少个bean,只要使用我告诉你的那个就行了。”因此,您可以发现
@Qualifier
和@Primary
都在告诉Spring在多个候选者都符合自动连接条件时使用特定的bean。但是@Qualifier
更具体,并且具有高优先级。因此,当@Qualifier
和@Primary
都被找到时,@Primary
将被忽略。下面是测试。
输出为“bean2”。
k3fezbri2#
此外,需要记住
@Qualifier
的优先级高于@Primary
,这意味着定义这两个注解是浪费。@Primary
表示默认实现,而@Qualifier
是具体实现。您可以查看我写的关于此注解的博客-http://shaikezam.com/#/spring_qualifier
lnlaulya3#
是,@限定符优先。是,我们可以同时使用@Primary和@Autowired。
@与应用程序上下文相关的配置类,可用于配置应用程序级配置。
mjqavswn4#
要访问相同类型的bean,我们通常使用
@Qualifier(“beanName”)
注解。我们在注入点将其与@Autowired
沿着应用。在我们的示例中,我们在配置阶段选择bean,因此@Qualifier
不能在此处应用。为了解决这个问题,Spring提供了
@Primary
注解沿着@Bean
注解。Source