@Autowired、@Resource还分不清吗?

        我发现很多朋友在编码时仍然在纠结这些问题,在对bean进行依赖注入时,我到底应该使用@Autowired还是@Resource?为什么项目代码中同事用的跟我不一样?到底谁对谁错,不同的注入姿势会对项目有什么影响吗?

        使用过spring的朋友都知道,我们基于xml对bean进行配置时,通常的依赖注入方式有:set注入构造器注入静态工厂注入实例工厂注入,由于繁琐且复杂,以上几种基于xml的注入方式,大家可以自行百度学习。本文只探讨基于注解方式的使用。

        @Autowired也好,@Resource也罢,又或者@inject都可以帮助我们管理bean实现依赖注入,它们都帮助我们简化了bean的配置。前两者在日常开发中使用比例是最高的,基本占据了90%的江山。

@Autowired

        首先,该注解由spring提供,它默认基于类型(所依赖的bean的类型的实现类)去寻找对应的bean。如下代码片段,当用户进行在线支付时,需要依赖PayService支付接口,这里假设该接口有且仅有一种具体的实现方式。具体实现是怎样的不重要,重要的是只有一种,那么这里只通过@Autowired一个注解是没有问题的。

        举个例子,中午午饭时间,当你走进一家饺子馆,这家饺子馆只售卖一种饺子(假设韭菜鸡蛋馅,因为我爱吃韭菜鸡蛋馅的,yyds!)你对老板说,老板来份饺子!即使你没有说出具体什么馅的饺子,老板也知道要给你上什么,因为这里只有一种饺子,老板默认就会给你上这一种!

        在这个例子中,你=接口调用者饺子馆=接口(提供售卖饺子服务)韭菜鸡蛋馅=接口具体实现(唯一实现)

@RestController
public class PayController {
​
    @Autowired
    private PayService payService;
​
    @RequestMapping(value = "/pay", method = RequestMethod.GET)
    public String pay(){
        return payService.pay();
    }
​
}

        但是当PayService有2种以上的实现方式时,只通过@Autowired来注入bean是行不通的,在项目启动时会报错,为什么?因为spring做不到,它不知道具体要注入哪个具体实现。

        依旧以上面的例子来说,饺子馆卖很多种饺子,如:韭菜鸡蛋馅、玉米猪肉馅、芹菜牛肉馅等等。你对老板说来份饺子,老板并不知道你具体要吃什么饺子,需要你准确描述想吃哪一种

@Qualifier

该注解用于指定要注入的bean的具体哪一个实现,也就是告诉饺子馆老板你具体要吃什么馅的饺子。该注解常见于一个接口多个实现的场景(包括一个实现的场景)。

        demo案例如下:当存在多种支付方式时,如果想指定注入微信支付,则可以通过@Qualifier("weChatPayServiceImpl")来指定接口的具体实现,至于注解括号中的内容,等于具体实现的类名的首字母的小写,这样spring就能帮我们完成注入。

@RestController
public class PayController {
​
    @Autowired
    @Qualifier("weChatPayServiceImpl")
    private PayService payService;
​
    @RequestMapping(value = "/pay", method = RequestMethod.GET)
    public String pay(){
        return payService.pay();
    }
​
}

@Resource

该注解也可以帮助我们完成bean的注入,但其跟@Autowired并不是完全一样的。首先,他并不是spring官方提供的注入方式,其次比较重要的一点是:其默认根据name寻找bean,即默认根据你注入的属性名来寻找具体实现,如果找不到会报错,这一点需要跟@Autowired重点区分。

下方两块代码段的作用是一致的

 @Resource
 private PayService weChatPayServiceImpl;
@Resource("weChatPayServiceImpl")
private PayService payService;

同样的,当存在多个bean的实现时,不管是使用@Autowired还是使用@Resource帮助我们注入时,都可以通过@Qualifier注解配合注入指定具体的实现。

故,使用@Autowired或@Resource都可以帮助我们完成bean的管理。无论使用哪种方式,都简化了xml的配置,在工作中两者均可使用,没有对错,请放心使用,只需要注意使用对应的注解时所需要的事项就可以了。

        另外,很多朋友只知道它们只能作用在字段属性上,其实注入的方式有很多种,比如构造器注入,set注入等,具体作用域可以参考注解的作用范围。

更多文章首发地,可以关注我的微信公众号:前程同学! 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值