前言
在之前分别写了关于@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:流程图不清晰可以保存到本地放大查看