首页 > 其他分享 >Spring中@Primary注解

Spring中@Primary注解

时间:2022-10-18 19:56:05浏览次数:65  
标签:return Spring Primary class bean Employee 注解 public

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 
 8     @Bean
 9     public Employee liSiEmployee() {
10         return new Employee("李四");
11     }
12 }

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

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

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

注入

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

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

看一下配置类:

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

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

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

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 }
1 @Component
2 @Primary
3 public class GeneralManager implements Manager {
4     @Override
5     public String getManagerName() {
6         return "General manager";
7     }
8 }

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

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

测试

 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 }

 

标签:return,Spring,Primary,class,bean,Employee,注解,public
From: https://www.cnblogs.com/fnlingnzb-learner/p/16803858.html

相关文章

  • SpringBoot引入OpenFeign,不使用注册中心
    转自:https://blog.csdn.net/wind_chasing_boy/article/details/123822427(做了部分修改)【前言】最近接到一个需求,需要对接第三方平台的api,在设计方案通过之后,打算将对接服......
  • Spring aop
    面向切面编程公共的通用的重复的代码快单独拿出来,在需要调用的方法中通过动态代理的方式进行静态代理![1665881007796]横向开发(C:\Users\hqq\AppData\Roamin......
  • 关于IDEA中Spring配置文件中的提示:File is included in 4 contexts.
    关于IDEA中Spring配置文件中的提示:Fileisincludedin4contexts.今天在学习SpringMVC框架的时候,由于web.xml中需要绑定Spring的配置文件,在配好Spring的配置文件并运行T......
  • 【SpringMvc】项目启动成功进入index页面,但@RequestMapping注解的路径报 500
    【爱迪的懂】项目正常启动成功进入index页面,但@RequestMapping注解的路径报500【避坑!】----------------------------------------------------------------------------......
  • Java 注解【转载】
    Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制。Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标......
  • SpringBoot(六) - 阿里巴巴的EasyExcel
    1、依赖<!--阿里EasyExcelstart--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></depe......
  • 【Spring Boot 开发实战】第3讲 Kotlin扩展函数
    幻灯片1.pngSpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。在Java开发领域的诸多著名框架:Spring......
  • 【Spring Boot 开发实战】第2讲 Kotlin类型系统与空安全
    幻灯片1.pngSpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。在Java开发领域的诸多著名框架:Spring......
  • Spring Reactor 项目核心库
    ReactorCoreNon-Blocking​​ReactiveStreams​​​FoundationfortheJVMbothimplementinga​​ReactiveExtensions​​inspiredAPIandefficienteventstre......
  • Spring 5.0.3.RELEASE中的 Kotlin 语言等支持
    Spring5.0.3.RELEASE中的Kotlin语言支持​​​1.Kotlin​​​​Kotlin​​​是静态类型语言定位的JVM(以及其他平台),它允许写简洁而优雅的代码,同时提供很好​​的互操作......