何时在 Spring 中使用 Qualifier 和 Primary
When to use Qualifier and Primary in Spring
我读到@Qualifier 可用于注入阶段,而@Primary 用于配置阶段。我还不清楚什么时候使用哪个。
我也有以下疑惑
@Primary和@Qualifier可以一起使用吗?如果是,@Qualifier 优先吗?
@Primary 可以和@Autowired 一起使用吗?
注入阶段与配置阶段有何不同,这是关于 Spring beans
是的,@Qualifier 优先。
是的,我们可以一起使用@Primary 和@Autowired。
@Configuration Class 与应用程序上下文相关,可用于配置应用程序级配置。
@Primary
表示当有多个candidates时应该优先考虑一个bean
有资格自动装配 single-valued 依赖项。
@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 都可以自动装配时,请使用 主要的 作为您的第一选择。”因此,Spring 将选择 bean1
自动连接到 BeanService
。
这是另一种将 bean1
自动连接到 BeanService
的方法,方法是在 BeanService.class
.
中使用 @Qualifier
@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”。
我们通常使用@Qualifier(“beanName”)
注解来访问相同类型的bean。我们将它与 @Autowired
一起应用于注入点。在我们的例子中,我们 select 配置阶段的 bean,所以 @Qualifier
不能在这里应用。
要解决此问题,Spring 提供了 @Primary
注释和 @Bean
注释。
此外,需要记住 @Qualifier
的优先级高于 @Primary
,这意味着定义这两个注释是浪费。
@Primary
表示默认实现,而@Qualifier
是具体实现。
您可以查看我写的有关此注释的博客 -
http://shaikezam.com/spring_qualifier
我读到@Qualifier 可用于注入阶段,而@Primary 用于配置阶段。我还不清楚什么时候使用哪个。
我也有以下疑惑
@Primary和@Qualifier可以一起使用吗?如果是,@Qualifier 优先吗?
@Primary 可以和@Autowired 一起使用吗?
注入阶段与配置阶段有何不同,这是关于 Spring beans
是的,@Qualifier 优先。 是的,我们可以一起使用@Primary 和@Autowired。
@Configuration Class 与应用程序上下文相关,可用于配置应用程序级配置。
@Primary
表示当有多个candidates时应该优先考虑一个bean
有资格自动装配 single-valued 依赖项。
@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 都可以自动装配时,请使用 主要的 作为您的第一选择。”因此,Spring 将选择 bean1
自动连接到 BeanService
。
这是另一种将 bean1
自动连接到 BeanService
的方法,方法是在 BeanService.class
.
@Qualifier
@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”。
我们通常使用@Qualifier(“beanName”)
注解来访问相同类型的bean。我们将它与 @Autowired
一起应用于注入点。在我们的例子中,我们 select 配置阶段的 bean,所以 @Qualifier
不能在这里应用。
要解决此问题,Spring 提供了 @Primary
注释和 @Bean
注释。
此外,需要记住 @Qualifier
的优先级高于 @Primary
,这意味着定义这两个注释是浪费。
@Primary
表示默认实现,而@Qualifier
是具体实现。
您可以查看我写的有关此注释的博客 - http://shaikezam.com/spring_qualifier