@Autowired和@Resource

Spring的一大核心功能就是IOC,它能帮助我们实现自动装配,


  • @Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

当我们在将一个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。

当需要使用这个bean的时候,例如加上@Autowired注解的时候,这个bean就会被创建。而且初始化是根据无参构造函数。

注释可以直接在属性上使用,因此不需要getter和setter:

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component("fooFormatter")
public class FooFormatter {

public String format() {
return "foo";
}
}

@Component
public class FooService {

@Autowired
private FooFormatter fooFormatter;

}

在上面的例子中,创建FooService时,Spring查找并注入fooFormatter。

不同点

1、@Resource是JDK原生的注解,@Autowired是Spring2.5 引入的注解

2、@Resource有两个属性name和type。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

@Autowired

img

@Resource

img

总结

@Autowired功能虽说非常强大,但是也有些不足之处。比如它跟Spring强耦合了,如果换成了其他框架,功能就会失效。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

除此之外,有些场景使用@Autowired无法满足的要求,改成@Resource却能解决问题。

1、@Autowired默认按byType自动装配,而@Resource默认byName自动装配。

2、@Autowired只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。

3、@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

4、@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

5、@Autowired是Spring定义的注解,而@Resource是JSR-250定义的注解。

6、二者装配顺序不同