本文已参与「新人创作礼」活动,一起开启掘金创作之路。
我们在工作中经常遇到Bean注入的问题,到底是使用@Autowired还是@Resouce呢? 下面我们先来运用一下,再做相应的总结:
public String eat();
}
@Service
public class ManPersonServiceImpl implements PersonService {
@Override
public String eat() {
return "男人喜欢吃肉。。。";
}
}
@Service
public class WomanPersonServiceImpl implements PersonService {
@Override
public String eat() {
return "女人喜欢吃素菜。。。";
}
}
@RestController
@RequestMapping("/test1")
public class TestController {
@Autowired
@Qualifier("ManPersonServiceImpl")
// @Resource(name = "ManPersonServiceImpl")
private PersonService personService;
private int a;
@RequestMapping("/testMapping")
public String testMapping1(){
System.out.println(personService.eat());
a++;
return "工程运行完成:" + a + "次!!---" + personService.eat();
}
}
我们一起来看下他们的区别: 1.@Autowired默认按byType自动装配。而@Resource默认byName自动装配。 2.@Autowired只有一个参数:required,表示是否开启自动准入,默认是true。@Resource包含七个参数,其中最重要的两个参数是:name 和 type。 3.@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。(@Resource(name = "ManPersonServiceImpl"),@Autowired()@Qualifier("ManPersonServiceImpl") Resource默认通过name查找,而Autowired默认通过type查找) 4.@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。 5.@Resource是JDK提供的,而@Autowired是Spring提供的 6.Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false))
注意:当出现多个实现类时:@Autowired需要和@Qualifier一起配合使用,也可以使用@Primary在实现类中提高优先级。@Resource可以直接指定类名。接口仅有单一实现类时,两个注解的修饰效果相同,可以互换。
总结: 推荐使用@Resource(name=“指定名称”) 原因: 1.根据名字搜索是最快的,就像查数据库,根据Id查找最快。 2.默认情况下是按照名称进行匹配,如果没有找到相同名称的Bean,则会按照类型进行匹配。 3.可扩展性强,一个接口多个实现的时候也不会影响。