我已经阅读到@Qualifier可以在注入阶段使用,而@Primary可以在配置阶段使用。尚不清楚何时使用。
我还有以下疑问
@Primary和@Qualifier可以一起使用吗?如果是,@ Qualifier优先吗?
@Primary可以与@Autowired一起使用吗?
在Spring Bean方面,注入阶段与配置阶段有何不同
答案 0 :(得分:1)
@Primary
表示当有多个候选者时,应优先考虑Bean
有资格自动装配单值依赖项。
@Qualifier
表示当有多个候选对象时应自动装配特定的bean。
例如,我们有两个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,“当发现两个以上都可以自动接线的bean时,请以 primary为主作为首选。”因此,Spring将选择bean1
自动连线到BeanService
。
这是通过使用bean1
中的BeanService
将@Qualifier
自动连接到BeanService.class
的另一种方法。
@Service
public class BeanService {
@Autowired
@Qualifier("bean1")
private BeanInterface bean;
}
@Qualifier
将告诉Spring,“无论您发现了多少个豆,只要使用我告诉您的那个豆。”
因此,您可以发现@Qualifier
和@Primary
都在让多个候选者有资格自动装配时告诉Spring使用特定的bean。但是@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”。
答案 1 :(得分:0)
是的,@ Qualifier优先。 是的,我们可以将@Primary和@Autowired一起使用。
与应用程序上下文相关的@Configuration类,将用于配置应用程序级别的配置。
答案 2 :(得分:0)
为了访问相同类型的 bean,我们通常使用 @Qualifier(“beanName”)
注释。我们将其与 @Autowired
一起应用于注入点。在我们的例子中,我们在配置阶段选择 bean,所以 @Qualifier
不能在这里应用。
为了解决这个问题,Spring 提供了 @Primary
注释和 @Bean
注释。