Spring的@Resource
和@Autowired
的注解都可以完成对象依赖注入功能,但相信很多人跟我一样,对这两者的注解区别不是很清楚。经过查阅各个大牛的博客后,写下此博文来简单的总结与分享。(ps: 本文是在《Spring Resource、Autowired、Qualifier的注解注入及区别》的基础上进行进一步总结,感谢OrderDong作者的分享。),接下来直接进入主题:
Spring提供了一种优秀的解耦方式,使用XML
配置文件或者注解的方式来管理Bean
的实现类和依赖关系。其中,在注解中可以使用@Resource
或者@Autowired
来完成注入。虽然这两个注解都可以完成依赖注入,但它们之间是有区别的。
(a). 默认是按byType or byName来注入
@Resource
默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
@Autowired
默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
(b). jar包
@Resource
注解是由J2EE提供,而@Autowired
是由spring提供。需要特别说明的是,如果要使用@Resource
,需要导入annotation-api.jar
包,tomcat已经包含了这个jar包。如果工程不是web项目,那就通过maven导入这个包。
(c). 共同点
@Resource和@Autowired都可以标注在字段或者该字段的setter方法上。
说了它们的区别和共同点,下面就谈下怎么使用。
举例
1、XML配置文件
使用注解的方式,需要修改Spring XML配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<context:component-scan base-package="com.lemory.controller"/>
</beans>
2、注入Bean
修改XML配置文件后,可以通过注解方式来注入bean。为了简单,本文使用教程中案例代码来说明。
(1)定义接口
定义Person接口:
public interface Person {
void useAxe();
}
定义Axe接口:
public interface Axe {
String chop();
}
(2)实现类
Axe接口实现类:
@Component
public class StoneAxe implements Axe{
public String chop() {
return "石斧砍柴有点慢";
}
}
-
Person接口实现类:
-
a. 使用
@Resource
注入Axe实现类。
@Component
public class Chinese implements Person {
@Resource
private Axe axe;
public void useAxe() {
System.out.println(axe.chop());
}
}
b. 使用@Autowired
注入Axe实现类。
@Component
public class Chinese implements Person {
@Autowired
private Axe axe;
public void useAxe() {
System.out.println(axe.chop());
}
}
(3)测试类代码
使用Spring test测试。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:application.xml"})
public class BeanTest {
@Autowired
private Person person;
@Test
public void useAxeTest() {
Assert.assertNotNull(person);
person.useAxe();
}
}
(4)测试结果
a. @Resource
石斧砍柴有点慢
b. @Autowired
石斧砍柴有点慢
从上述测试结果可以看出,使用@Resource
和@Autowired
都可以完成依赖注入。 但由于@Autowired
它首先会根据类型去查找,如果Spring上下文存在多个类实现了Axe接口的话,就会抛出BeanCreationException异常,可以使用@Qualifier
配合@Autowired
来解决这些问题。