>@Autowired与@Resource的区别
目前我们使用 `RequiredArgsConstructor` 比较多,详细可以看看 [**这篇文章**](https://lixj.fun/archives/requiredargsconstructor)。
# @Autowired 注解
来源:`@Autowired` 为 Spring 提供的注解,需要导入包`org.springframework.beans.factory.annotation.Autowired`。
说明:@Autowired 采取的默认策略为按照类型注入(by-type)。要求容器中一定要有这个类型的对象,如果没有将会报错,抛出异常。也可以通过设置可以 @Autowired(required = false),来告诉容器,如果没有可以不注入。
示例:
```java
public class StudentController {
@Autowired
private StudentServer studentServer;
}
```
如上代码所示,这样装配会去 spring 容器中找到类型为 StudentServer 的类,然后将其注入进来。这样会产生一个问题,当容器中有多个相同类型的对象,会造成无法选择具体注入哪一个的情况从而导致报错,这个时候我们可以通过 @Qualifier("beanname"),来指定装配哪个对象。
```java
public class StudentController {
@Autowired
@Qualifier(name="studentServer")
private StudentServer studentServer;
}
```
@Qualifier 注解会告诉 spring 去装配 StudentServer 对象。这个时候我们就可以成功注入正确的对象了。
# @Resource注解
来源:`@Resource` 注解由J2EE提供,需要导入包 `javax.annotation.Resource`。
说明:@Resource 可以设置 by-name (按名称)和 by-type (按类型)来进行自动装配。如果没指定则默认按照 ByName 自动注入。
示例:
```java
public class StudentController {
@Resource
private StudentServer studentServer;
}
```
没有指定 name,又没有指定 type,该注解会自动按照 by-name 方式进行装配,如果匹配则自动装配。如果没有匹配,则按照 by-type 进行查找,如果都没查找到,那么则抛出异常。
```java
public class StudentController {
@Resource(name="studentServer")
private StudentServer studentServer;
}
```
指定了 name,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。
```java
public class StudentController {
@Resource(type="StudentServer")
private StudentServer studentServer;
}
```
指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会抛出异常。
```java
public class StudentController {
@Resource(name="studentServer",type="StudentServer")
private StudentServer studentServer;
}
```
同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
# 总结
@Autowired 是 Spring 的注解通过类型(type)来实现装配 Bean,也可以通过名称(name)来装配Bean(需要配合 @Qualifier("beanname") 使用)。依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false @Autowired(required=false)。
@Resource 是 J2E E的注解是 Java 自已的东西使用 @Resource 可以减少代码和 Spring 之间的耦合。它可以通过 by-type 来实现装配 Bean,也可以 by-name 进行装配,如果指定了则按照指定的进行装配,如果都没指定的话先 by-name 后 by-type 也可以同时指定 by-name 与 by-type。
>原文链接:https://juejin.cn/post/7064823104584810532

@Autowired与@Resource的区别