前言
本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入的几个知识点。感兴趣的读者可以先看下以下问题:
- @Autowired, @Resource, @Inject 三个注解的区别
- 当你在使用@Autowired时,是否有出现过Field injection is not recommended的警告?你知道这是为什么吗?
- Spring 依赖注入有哪几种方式?官方是怎么建议使用的呢?
如果你对上述问题都了解,那我个人觉得你的开发经验应该是不错的。
下面我们就依次对上述问题进行解答,并且总结知识点。
@Autowired, @Resource, @Inject 三个注解的区别
Spring 支持使用@Autowired, @Resource, @Inject 三个注解进行依赖注入。下面来介绍一下这三个注解有什么区别。
@Autowired
@Autowired为Spring 框架提供的注解,需要导入包
org.springframework.beans.factory.annotation.Autowired。
这里先给出一个示例代码,方便讲解说明:
public interface Svc {
void sayHello();
}
@Service
public class SvcA implements Svc {
@Override
public void sayHello() {
System.out.println("hello, this is service A");
}
}
@Service
public class SvcB implements Svc {
@Override
public void sayHello() {
System.out.println("hello, this is service B");
}
}
@Service
public class SvcC implements Svc {
@Override
public void sayHello() {
System.out.println("hello, this is service C");
}
}
复制代码
测试类:
@SpringBootTest
public class SimpleTest {
@Autowired
// @Qualifier("svcA")
Svc svc;
@Test
void rc() {
Assertions.assertNotNull(svc);
svc.sayHello();
}
}
复制代码
装配顺序:
- 按照type在上下文中查找匹配的bean查找type为Svc的bean 复制代码
- 如果有多个bean,则按照name进行匹配如果有@Qualifier注解,则按照@Qualifier指定的name进行匹配