共同点
@Resource和@Autowired都可以对属性进行注入,当修饰的接口仅有单个实现类是,两个注解的修饰效果相同,可以相互替换。
不同点
- @Resource是JDK原生的,@Autowired是Spring2.5 引入的
- @Resource默认通过名称进行匹配
- @Resouce有两个属性name和type
- 指定name,按名称匹配。若用名称匹配成功,注入。若用名称匹配失败,报NoSuchBeanDefinitionException。
- 指定type,按类型匹配。有三种情况,没有、匹配到一个或多个。按类型没有匹配到,报NoSuchBeanDefinitionException;若匹配到一个,注入;若匹配到多个,报NoUniqueBeanDefinitionException。
- 指定name和type,名称和类型同时匹配,若匹配成功,注入,否则报NoSuchBeanDefinitionException。
- @Autowired默认按照类型匹配
- 若spring容器中没有该类型的bean,就报NoSuchBeanDefinitionException,如果有一个bean就将其注入。
- 若spring容器中有多个此类型的bean。如果@Autowired作用在字段上,用字段名称匹配,匹配不成功报NoSuchBeanDefinitionException。如果@Autowired做用在setter方法或者构造方法上,用形参名去匹配,匹配不成功报NoUniqueBeanDefinitionException。
- @Autowired和@Qualifer一同使用,@qualifer可以指定bean的名称,当类型和名称都匹配是注入,否则报NoSuchBeanDefinitionException。
实践
定义接口做饭Cook.java,抽象方法open()
、cooking()
、close()
public interface Cook {
/**
* 开火
*/
String open();
/**
* 炒菜
*/
String cooking();
/**
* 关火
*/
String close();
}
定义实现类炒西红柿CookTomato.java
/**
* service接口 实现类
* 炒西红柿
*/
@Service
public class CookTomato implements Cook {
@override
public