美团一面:@Autowired 注解和@Resource有什么区别
大家在编写代码的时候有没有发现@Autowired会出现如下的提示符合
Field injection is not recommended (字段注入是不被推荐的)
再看@Resource就不会出现提示
首先要了解Spring常见的DI方式
1. 构造器注入:利用构造方法的参数注入依赖
2. setter注入:调用setter的方法注入依赖
3. 字段注入:在字段上使用@Autowired/@Resource注解
在代码中使用
1.构造器注入
@RestController
@RequestMapping("/test")
public class TestController {
private final TestService testService;
private final String result;
public ConstructorController(TestService testService) {
this.testService = testService;
this.result = testService.test("test");
}
@GetMapping("/test")
public String test() {
return testService.test(this.result);
}
}
2.setter注入
@RestController
@RequestMapping("/test")
public class TestController {
private TestService testService;
@Autowired
public void setTestService(TestService testService) {
this.testService = testService;
}
}
3.基于注解
@Autowired
private UserService userService;
Spring官方文档,建议了如下的使用场景:
构造器注入:强依赖性(即必须使用此依赖),不变性(各依赖不会经常变动)
Setter注入:可选(没有此依赖也可以工作),可变(依赖会经常变动)
Field注入:大多数情况下尽量少使用字段注入,一定要使用的话, @Resource相对@Autowired对IoC容器的耦合更低
@Autowired和@Resource的区别
来源:@Autowired是Spring特有的注解,而@Resource是Java标准的注解。
自动装配规则:@Autowired默认按类型进行自动装配,@Resource默认按名称进行自动装配。
使用范围:@Autowired可以用于构造方法、字段、Setter方法等,而@Resource只能用于字段和Setter方法。
注入机制:@Autowired不能注入基本类型的值,而@Resource可以。
那么问题来了,为什么IDEA只对@Autowired警告,却对@Resource视而不见呢
就像我们前面提到过的:@Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不能够支持注入的。
然而 @Resource是JSR-250提供的,它是Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。