@Autowired 和 @Resource 的区别
-
相同点:
- @Resource 作用相当于 @Autowired,均可标注在字段或属性的 setter 方法上
-
不同点:
-
提供方:
- @Autowired 是由 org.springframework.beans.factory.annotation.Autowired 提供,换句话说就是由 spring 提供
- @Resource 是由 javax.annotation.Resource 提供,即 J2EE 提供,需要 jdk1.6 及以上
-
注入方式:
- @Autowired 只按照 byType 注入
- @Resource 默认按 byName 自动注入,也提供按照 byType 注入
-
属性:
- @Autowired 按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置 required 属性为 false;如果使用按名称装配,可以结合 @Qualifier 注解一起使用
- @Resource 有两个中重要的属性
- name:name 属性指定 byName,如果没有指定 name 属性,当注解标注在字段上,即默认取字段的名称作为 bean 名称寻找依赖对象,当注解标注在属性的 setter 方法上,即默认取属性名作为 bean 名称寻找依赖对象
- type:需要注意的是,@Resource 如果没有指定 name 属性,并且按照默认的名称仍然找不到依赖对象时, @Resource 注解会回退到按类型装配,但一旦指定 name 属性,就只能按名称装配
-
-
代码举例
@Autowired
@Resource
private MemberService memberService;@Autowired: 按照 MemberService 注入 byType
@Resource: 安装 memberService 注入 byName
@Resource: @Resource(type = MemberService.class) byType -
bean 的 type 相同,name 不相同
-
如果有下面的场景,bean 的 type 是一样的,如果使用 byType 注入,就会报错
- @Autowired:只能根据 byType 注入,但是结合 @Qualifier,可以根据 beanName 注入
- @Resource:可以根据 byName 注入,可以使用 @Resource(name=“member1”) 注入
@Configuration
public class TestConfiguration {@Bean("member1") public MemberService build1() { return new MemberService(); } @Bean("member2") public MemberService build2() { return new MemberService(); }
}
-