spring 源码解析之注解篇@Primary

62 阅读1分钟

前言

此篇为 spring 源码解析注解篇,想了解 spring 源码解析更多内容,可查看spring 源码解析目录

@Primary

Spring的@Primary注解是在Spring 3.0版本引入的。简单来说,当存在多个相同类型的bean时,我们使用@Primary来给某个bean赋予更高的优先级。

例如,假设我们有两个Employee类型的bean,JohnEmployee()和TonyEmployee():

 @Configuration
 public class Config {
     @Bean
     public Employee JohnEmployee() {
         return new Employee("John");
     }
 ​
     @Bean
     public Employee TonyEmployee() {
         return new Employee("Tony");
     }
 }

如果我们尝试运行应用,Spring会抛出NoUniqueBeanDefinitionException异常。为了解决这个问题,Spring提供了@Primary注解。我们可以在TonyEmployee() bean上标记@Primary,这样Spring在注入Employee bean时会优先选择TonyEmployee()。

 @Configuration
 public class Config {
     @Bean
     public Employee JohnEmployee() {
         return new Employee("John");
     }
     @Bean
     @Primary
     public Employee TonyEmployee() {
         return new Employee("Tony");
     }
 }

现在,当我们启动应用上下文并从中获取Employee bean时,会看到TonyEmployee()实例在自动装配时具有优先级。

在 bean 中使用

我们也可以直接在bean上使用@Primary。例如,我们有一个Manager接口和两个子类bean,DepartmentManager和GeneralManager。我们在GeneralManager bean上标记@Primary。这样,当我们启用组件扫描时,如果需要Manager类型的bean,Spring会优先使用GeneralManager bean。

 @Component
 public class DepartmentManager implements Manager {
     @Override
     public String getManagerName() {
         return "Department manager";
     }
 }
 ​
 @Component
 @Primary
 public class GeneralManager implements Manager {
     @Override
     public String getManagerName() {
         return "General manager";
     }
 }