聊聊依賴注入註解@Resource和@Autowired
阿新 • • 發佈:2020-06-08
![](https://img2020.cnblogs.com/other/1739473/202006/1739473-20200608092516512-2108714019.png)
## 1. 前言
`@Resource`和`@Autowired`註解都可以在**Spring Framework**應用中進行宣告式的依賴注入。而且面試中經常涉及到這兩個註解的知識點。今天我們來總結一下它們。
## 2. @Resource
全稱`javax.annotation.Resource`,它屬於**JSR-250**規範的一個註解,包含**Jakarta EE**(**J2EE**)中。**Spring**提供了對該註解的支援。我們來詳細瞭解一下該註解的規則。
**該註解使用在成員屬性和setter方法上。預設情況下`@Resource`按照名稱注入,如果沒有顯式宣告名稱則按照變數名稱或者方法中對應的引數名稱進行注入。**
![Resource註解流程](https://img2020.cnblogs.com/other/1739473/202006/1739473-20200608092516704-811666920.png)
如果我們希望在目標Bean中體現多型我們可以這樣寫:
```java
/**
* 多型的體現.
*
* @author felord.cn
* @since 9 :26
*/
@Component
public class ResourceTest {
@Resource
private ApplicationRunner applicationRunner;
@Resource
private ApplicationRunner runner;
// ...
}
```
> Qualifier 約束參見 [Spring 註解 @Qualifier 詳細解析](https://felord.cn/spring-qualifier.html)
## 3. @Autowired
`@Autowired`通常適用於建構函式,成員變數以及方法上。它的機制是這樣的:
![Autowired流程](https://img2020.cnblogs.com/other/1739473/202006/1739473-20200608092516916-664122315.png)
這個註解我們是需要好好聊聊的,日常使用頻率相當高。
### 3.1 標註在構造上
通過在目標**Bean**的建構函式上標註就可以注入對應的**Bean**。
```java
package cn.felord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @author felord.cn
* @since 9:26
**/
@Component
public class AutowiredTest {
private final ApplicationRunner applicationRunner;
@Autowired
public AutowiredTest(ApplicationRunner applicationRunner) {
this.applicationRunner = applicationRunner;
}
}
```
> 從**Spring Framework 4.3**開始,`@Autowired`如果目標Bean只定義一個建構函式,則不再需要在該建構函式上新增`@Autowired`註解。如果目標Bean有幾個建構函式可用,並且沒有主/預設建構函式,則必須至少有一個建構函式被`@Autowired`標記,以指示Spring IoC容器使用哪個建構函式。
### 3.2 標註在成員變數上
和`@Resource`一樣,`@Autowired`也可以標註到目標**Bean**的成員變數上。
```java
/**
* @author felord.cn
* @since 9:26
**/
@Component
public class AutowiredTest {
@Autowired
private ApplicationRunner applicationRunner;
// ...
}
```
### 3.3 標註到方法上
一般setter方法上使用的比較多。而且一個 `@Autowired` 支援注入多個引數。
```java
/**
* The type Autowired test.
*
* @author felord.cn
* @since 9 :26
*/
@Component
public class AutowiredTest {
private ApplicationRunner applicationRunner;
private EmployeeMapper employeeMapper;
private DepartmentMapper departmentMapper;
/**
* Sets application runner.
*
* @param applicationRunner the application runner
*/
@Autowired
public void setApplicationRunner(ApplicationRunner applicationRunner) {
this.applicationRunner = applicationRunner;
}
/**
* 支援多引數
*
* @param employeeMapper the employee mapper
* @param departmentMapper the department mapper
*/
@Autowired
public void prepare(EmployeeMapper employeeMapper, DepartmentMapper departmentMapper) {
this.employeeMapper = employeeMapper;
this.departmentMapper = departmentMapper;
}
}
```
你以為這就完了?下面這種方式估計大多數人並沒有在意過。
```java
/**
* The type Autowired test.
*
* @author felord.cn
* @since 9 :26
*/
@Component
public class AutowiredTest {
// 注入 陣列
@Autowired
private MovieCatalog[] movieCatalogs;
pri