Spring中的@Autowired、@Qualifier和@Primary注解详解
作者:桐花思雨
这篇文章主要介绍了Spring中的@Autowired、@Qualifier和@Primary注解详解,@Autowired 注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作,@Autowired 是默认根据 byType 进行自动装配的,需要的朋友可以参考下
1. @Autowired 注解
1.1. @Autowired 注解的使用
@Autowired 注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作
1.1.1. 类成员变量上(较为常用)
@Controller public class SoakController { @Autowired private SoakService soakService; }
1.1.2. 用在方法上
@Controller public class SoakController { private SoakService soakService; @Autowired public void setSoakService(SoakService soakService) { this.soakService = soakService; } }
1.1.3. 用在构造器上
@Controller public class SoakController { private SoakService soakService; @Autowired public SoakController(SoakService soakService) { this.soakService = soakService; } }
1.1.4. 用在参数上
@Controller public class SoakController extends BaseController { private SoakService soakService; public SoakController(@Autowired SoakService soakService) { this.soakService = soakService; } }
1.2. @Autowired 注解的说明
- 默认优先按照 byType 去容器中找对应的组件,找到就赋值
- 如果找到多个相同类型的组件,再通过 byName 来到 IOC 容器中进行查找
- 默认情况下,它具有强制契约特性,其所标注的属性必须是可装配的。如果没有 bean 可以装配到 @Autowired 所标注的属性或参数中,那么你会看到 org.springframework.beans.factory.NoSuchBeanDefinitionException 的异常信息
2. @Autowired 配合 @Qualifier
- @Autowired 是默认根据 byType 进行自动装配的,如果需要按 byName 进行装配,则需要配合 @Qualifier 注解使用
- 如果容器中存在多个相同类型的组件,此时需要通过 byName 来进行装配,则需要配合 @Qualifier 注解使用
组件 1
@Service public class BookService {// 类型为 BookService,name 为 bookService }
组件 2
@Configuration public class MainConfigOfAutowired { // 类型为 BookService,name 为 bookService01 @Bean public BookService bookService01() { return new BookService(); } }
测试
@Autowired @Qualifier("bookService01") private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
由于容器中存在 bookService01 和 bookService 两个类型相同的组件 bean,那么此时可以使用 @Qualifier(“bookService01”) 明确指定 bean 的 name 后,@Autowired 不再根据 byType 自动装配了,而用 bookService01 作为组件的 name 去容器中查找,找到组件 2,装配成功
3. @Autowired 配合 @Primary
- Spring 在进行自动装配的时候,会 优先 使用用 @Primary 标注指定的 bean
- 如果容器中有多个组件 Type 类型相同,注入的 bean 的 Name 名称也相同,那么此时就可以使用 @Primary 注解,将某一个组件 优先 注入
- 不能把多个 bean 都标注为 @Primary,不然你会得到 NoUniqueBeanDefinitionException 这个异常
组件 1
@Service public class BookService { // 类型为 BookService,name 为 bookService }
组件 2
@Configuration public class MainConfigOfAutowired { // 类型为 BookService,name 为 bookService01 @Primary @Bean public BookService bookService01() { return new BookService(); } }
测试 1
@Autowired private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
因为组件 2 使用了 @Primary 注解标注,所以 @Autowired 会优先使用 name 为 bookService01 进行装配
测试 2
@Qualifier("bookService") @Autowired private BookService bookService; @Test public void MyTest() { System.out.println(bookService); }
虽然组件 2 使用了 @Primary 注解标注,但是 @Qualifier 比 @Primary 的优先级要高,所以使用注解 @Qualifier 标注指定后, @Primary 就不起作用了,所以还是直接用指定的 bookService 作为组件的 name 去容器中装配
到此这篇关于Spring中的@Autowired、@Qualifier和@Primary注解详解的文章就介绍到这了,更多相关@Autowired、@Qualifier和@Primary注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!