记一下Spring学习记录中@Resource 与 @Autowired 区别。
注意
使用注解来实现自动注入,一定需要开启注解功能,即:在spring bean的xml中添加一下配置:
<context:annotation-config/>
相同点
- 功能几乎是一样的,
- 两者都可以实现自动注入(字段和set())
- 都是优先byName,然后才是byType
不同点
@Resource
- 被注解的对象不允许为null,也就是必须找到一个对应的bean
- 可以直接在该注解上声明指定id的bean,如:@Resource(name="xxx")
- 属于java官方的注解
@Autowired
- 被注解的对象允许为null,只需要设置它的 required = false 即可,如:@Autowired(required = false)
- 若需要注入指定id的bean,则需要@Qualifier配合,如:@Qualifier(value = "xxx")
- 属于spring的注解
使用建议
鉴于两者功能几乎相同,所以推荐使用java官方的 @Resource 注解,这样可以降低与spring的耦合度。
package com.billy.pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.Resource;
/**
* @author billy
* @Autowired 和 @Resource 2个注解都可以实现自动注入功能,
* @Resource 属于java的注解,
* @Autowired 属于spring的注解,
* 推荐优先使用 @Resource 注解,这样可以降低与spring的耦合度
* @date 2020-05-20
*/
public class Person {
private String name;
/** 设置required=false,表示若没有找到对应的bean,则允许为null */
@Autowired(required = false)
@Qualifier("dog2")
private Dog dog;
@Resource(name = "cat1")
private Cat cat;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", dog=" + dog +
", cat=" + cat +
'}';
}
}