前言
本章的内容主要是想探讨我们在进行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();}@Servicepublic class SvcA implements Svc { @Override public void sayHello() { System.out.println("hello, this is service A"); }}@Servicepublic class SvcB implements Svc { @Override public void sayHello() { System.out.println("hello, this is service B"); }}@Servicepublic class SvcC implements Svc { @Override public void sayHello() { System.out.println("hello, this is service C"); }}
测试类:
@SpringBootTestpublic class SimpleTest { @Autowired // @Qualifier("svcA") Svc svc; @Test void rc() { Assertions.assertNotNull(svc); svc.sayHello(); }}
装配顺序:
1.按照type在上下文中查找匹配的bean,查找type为Svc的bean
2.如果有多个bean,则按照name进行匹配
- 如果有@Qualifier注解,则按照@Qualifier指定的name进行匹配,查找name为svcA的bean
- 如果没有,则按照变量名进行匹配,查找name为svcA的bean
3.匹配不到,则报错。(@Autowired(required=false),如果设置require