共同点
两个注解的作用一样,都是做 bean 的注入,在接口只有一个实现类的时候,两个注解能够交替应用。
两者都能够写在字段和 setter 办法上,两者如果都写在字段上,那么就不须要再写 setter 办法
不同点
@Autowired
@Autowired 为 Spring 提供的注解,须要导入包 org.springframework.beans.factory.annotation.Autowired;
只依照 byType 注入。
@Autowired 注解是依照类型(byType)拆卸依赖对象,默认状况下它要求依赖对象必须存在,如果允 许 null 值,能够设置它的 required 属性为 false。如果咱们想应用依照名称(byName)来拆卸,能够联合 @Qualififier 注解一起应用。
@Resource
@Resource 默认依照 ByName 主动注入,由 J2EE 提供,须要导入 javax.annotation.Resource。
@Resource 有两个重要的属性:name 和 type,而 Spring 将 @Resource 注解的 name 属性解析为 bean 的 名字,而 type 属性则解析为 bean 的类型。所以,如果应用 name 属性,则应用 byName 的主动注入策 略,而应用 type 属性时则应用 byType 主动注入策略。如果既不制订 name 也不制订 type 属性,这时将通 过反射机制应用 byName 主动注入策略。
注:最好是将 @Resource 放在 setter 办法上,因为这样更合乎面向对象的思维,通过 set、get 去操作属 性,而不是间接去操作属性。
其实 @Resource 并不是 spring 的注解,它的包 是 javax.annotation.Resource,须要导入,然而 Spring 反对该注解的注入。
@Resource 拆卸程序:
①如果同时指定了 name 和 type,则从 Spring 上下文中找到惟一匹配的 bean 进行拆卸,找不到则抛出异 常。
②如果指定了 name,则从上下文中查找名称(id)匹配的 bean 进行拆卸,找不到则抛出异样。
③如果指定了 type,则从上下文中找到相似匹配的惟一 bean 进行拆卸,找不到或是找到多个,都会抛 出异样。
④如果既没有指定 name,又没有指定 type,则主动依照 byName 形式进行拆卸;如果没有匹配,则回 退为一个原始类型进行匹配,如果匹配则主动拆卸。
@Resource 的作用相当于 @Autowired,只不过 @Autowired 依照 byType 主动注入。