经常我们会碰到有人注入使用@Resource,有人使用@Autowired,这里简单明了地总结一下两者的区别。
首先最大的区别,@Resource是Java提供的注解,而**@Autowired**则是Spring提供的注解:
@Resource
import javax.annotation.Resource;
@Autowired
import org.springframework.beans.factory.annotation.Autowired;
其次,两者自动注入查找的方式也不一样:
- @Resource先按照byName去找,如果没有则会按照byType去找。当然,一旦你如果设置了name属性,那它只会根据byName去找,找不到就直接报错了。
- @Autowired顺序相反,先按照byType去找,如果没有则按照byName去找。
最后应用场景和性能不一样:
@Autowired效率比较低,@Resource效率较高。
当接口只有一个实体类实例的时候,两者都差不多,但是当接口的实例超过1个的时候,我们需要根据名字去指定加载的接口实例的时候,使用**@Resource(name = “xxxx”')要比@Autowired组合@Qualifier**效率高很多…
举例:此时存在接口PersonService,但它存在两个实例ManSeviceImpl和WomanServiceImpl,我们就可以使用@Resource来指定接口实现的名字,从而保证注入的对应实例是我们需要的:
PersonService:
public interface PersonService {
String run();
}
ManServiceImpl:
@Service("manService")
public class ManServiceImpl implements PersonService{
@Override
public String run() {
return "man running...";
}
}
WomanServiceImpl:
@Service("womanService")
public class WomanServiceImpl implements PersonService{
@Override
public String run() {
return "woman running...";
}
}
定义PersonController进行测试:
@RestController
public class PersonController {
@Resource(name = "manService")
private PersonService personService;
@GetMapping("/person")
public String testPerson() {
return personService.run();
}
}
postman测试结果: