Spring中@Primary注解

冷不防 2023-01-17 13:58 283阅读 0赞

1.概述

讨论Spring的@Primary注解,该注解是框架在3.0版中引入的。

其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。

2.为什么需要@Primary?

在某些情况下,需要注册多个相同类型的bean。

在此示例中,有Employee类型的zhangSanEmployee()和liSiEmployee()Bean:

  1. @Configuration
  2. public class PrimaryConfig {
  3. @Bean
  4. public Employee zhangSanEmployee() {
  5. return new Employee("张三");
  6. }
  7. @Bean
  8. public Employee liSiEmployee() {
  9. return new Employee("李四");
  10. }
  11. }

如果尝试运行应用程序,与@Autowired一起应用于注入。Spring会抛出NoUniqueBeanDefinitionException。

要访问相同类型的bean,常使用@Qualifier(“beanName”)注解,通过别名控制访问相同类型。

  1. @Configuration
  2. public class PrimaryConfig {
  3. @Bean
  4. @Qualifier("zhangSanEmployee")
  5. public Employee zhangSanEmployee() {
  6. return new Employee("张三");
  7. }
  8. @Bean
  9. @Qualifier("liSiEmployee")
  10. public Employee liSiEmployee() {
  11. return new Employee("李四");
  12. }
  13. }

注入

  1. @Resource
  2. private Employee zhangSanEmployee;
  3. @Resource
  4. private Employee liSiEmployee;

3.将@Primary和@Bean一起使用

看一下配置类:

  1. @Configuration
  2. public class PrimaryConfig {
  3. @Bean
  4. public Employee zhangSanEmployee() {
  5. return new Employee("张三");
  6. }
  7. @Bean
  8. @Primary
  9. public Employee liSiEmployee() {
  10. return new Employee("李四");
  11. }
  12. }

用@Primary标记liSiEmployee()bean。 Spring将优先于zhangSanEmployee()注入liSiEmployee()bean。

  1. @Test
  2. public void test1() {
  3. AnnotationConfigApplicationContext context
  4. = new AnnotationConfigApplicationContext(PrimaryConfig.class);
  5. Employee employee = context.getBean(Employee.class);
  6. System.out.println(employee);//Employee(name=李四)
  7. }

4.将@Primary与@Component一起使用

可以直接在bean上使用@Primary。

  1. public interface Manager {
  2. String getManagerName();
  3. }

有一个Manager接口和两个子类bean

  1. @Component
  2. public class DepartmentManager implements Manager {
  3. @Override
  4. public String getManagerName() {
  5. return "Department manager";
  6. }
  7. }
  8. @Component
  9. @Primary
  10. public class GeneralManager implements Manager {
  11. @Override
  12. public String getManagerName() {
  13. return "General manager";
  14. }
  15. }

都覆盖Manager接口的getManagerName()。 另外,请注意,用@Primary标记了GeneralManager bean。

  1. @Service
  2. public class ManagerService {
  3. @Autowired
  4. private Manager manager;
  5. public Manager getManager() {
  6. return manager;
  7. }
  8. }

测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class PrimaryTest {
  4. @Resource
  5. private ApplicationContext context;
  6. @Test
  7. public void test2() {
  8. ManagerService service = context.getBean(ManagerService.class);
  9. Manager manager = service.getManager();
  10. System.out.println(manager.getManagerName());//General manager
  11. }
  12. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 @Primary注解

    在看项目的时候看到了@Primary,因为之前没留意过,所以就去学习了一下,在此记录一下自己的理解,感叹一下还要学习的东西太多了,慢慢加油。 1.概述 @Pri

    相关 Spring@Primary注解

    1.概述 讨论Spring的@Primary注解,该注解是框架在3.0版中引入的。 其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的