美团一面:@Autowired 注解和@Resource有什么区别

美团一面:@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相对@AutowiredIoC容器的耦合更低

@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容器应当去兼容它,这样即使更换容器,也可以正常工作。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值