@Autowired和@Resource两个注解的异同点

前言

在之前分别写了关于@Autowired和@Resource注解的两篇博文,这里我们总结一下两个注解的异同点

相同点

  • 两个注解的作用都是完成Spring的依赖注入
  • 两个注解都是在各自bpp的postProcessMergedBeanDefinition方法中发现注入点,都是在各自bpp的postProcessProperties方法中完成依赖注入

不同点

来源不同

  • @Autowired:Spring相关注解
  • @Resource:Java规范定义的注解

作用范围不同

  • @Autowired : 属性、方法、构造方法
  • @Resource : 属性、方法

@Autowired用法案例

@Component
public class MixComponent {
 
    @Autowired
    private ComponentA componentA;
 
    private ComponentB componentB;
 
    private ComponentC componentC;
 
    @Autowired
    public void setComponentB(ComponentB componentB) {
        this.componentB = componentB;
    }
 
    public MixComponent() {
    }
 
    @Autowired
    public MixComponent(ComponentC componentC) {
        this.componentC = componentC;
    }
}

  @Resource用法案例 

@Component
public class MixComponent {
    
    @Resource
    private ComponentA componentA;
    
    private ComponentB componentB;

    @Resource
    public void setComponentB(ComponentB componentB) {
        this.componentB = componentB;
    }
}

PS :  @Autowired和@Resource都是不支持static的属性和方法的,@Autowired遇到static的属性和方法会忽略,@Resource遇到static的属性和方法会抛出异常

灵活程度不同

  • @Autowired : 可以通过设置required = false,实现宽松注入
  • @Resource : 必须注入,可以指定beanName

查找依赖的流程可能不同

为什么说查找依赖的流程可能不同,因为@Resource通过某些设置,其实是可以@Autowired查找方式相同,我听到的最多的说法就是@Autowired是先根据类型查找,再根据名称查找,@Resource是先根据名称查找,再根据类型查找。对于这个说法我先举个例子

@Component
public class House {
    
    @Resource(name = "dog1")
    private Dog dog;
}

@Component
public class Dog {

}

如果上述的说法是正确的,Spring容器应该能正常启动,但是实际会抛出异常

@Autowired查找依赖相关源码

 @Resource查找依赖相关源码

查找依赖流程图

 下列这种写法,@Autowired和@Resource查找依赖方法一样

@Component
public class House {
    
    @Resource
    private Dog dog1;
}

@Component
public class Dog {

}

PS:流程图不清晰可以保存到本地放大查看

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值