相同点:它们都是起到注入bean的作用
不同点
- 厂商不同:@Resouce是由jdk提供的;@Autowired是由Spring提供的
- 方式不同
2.1 )@Resouce默认是byName注入,如果byName找不到匹配的bean,就会转为byType找,如果还是找不到或者找到多个,则会抛出异常。@Resouce中有name属性,byName就是按name属性去寻找bean的。如果没有指定name只,那name默认就是被修饰的变量名;如果具体写了name的值,则只会按照byName去找bean,不会转为byType找。
2.2 )@Autowired默认是byType注入,如果byType找不到或找到多个,则会转为byName找,如果还是找不到,则会抛出异常。如果@Autowired找到多个,也可以在加@Qualifier通过byName指定某一个bean。
下面是实验代码
public class StudyApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
ac.start();
Country country = ac.getBean(Country.class);
System.out.println(country.getName());
System.out.println(country.getGdProvince().getName());
System.out.println(country.getGxProvince().getName());
}
}
@Configuration
public class Configration {
@Bean(name = "gdProvince") //可以修改这里去测试@Resouce和@Autowired的机制
public Province gdProvince(){
Province province = new Province();
province.setName("广东省");
return province;
}
@Bean(name = "gxProvince2") //可以修改这里去测试@Resouce和@Autowired的机制
public Province getProvince(){
Province province = new Province();
province.setName("广西省");
return province;
}
}
@Component
@Data
public class Country {
@Resource(name = "gdProvince") //可以修改这里去测试@Resouce的机制
private Province gdProvince;
@Autowired //可以修改这里去测试@Autowired的机制
private Province gxProvince;
private String name = "中国";
@Data
public class Province {
private String name;
}