SpringBoot中@Autowired和@Resource的区别

@Autowired和@Resource都可以用于标记自动装配,作用一样但有些区别。
@Autowired默认按类型匹配
但这样通过@Autowired有可能找到多个同类型的bean,在这种情况下可以使用@Qualifier注解来找到要装配的bean,例如

@Autowired(require = true) // 一定要找到匹配的bean,否则抛出异常,缺省为true
@Qualifier("beanName")

所以,在用@Service注解业务接口实现类Impl而没有给予它name的情况下,如果只写@Autowired的话,需要保证业务接口只有一个实现类。在有多个实现类的情况下则要给予name(@Service不给予名字的情况下实现类bean的名字默认为实现类名的小驼峰)并使用@Qualifier。

@Resource默认按名匹配,找不到时按类型匹配

@Resource
TestService testService; // 默认查找名字为testService的bean

public interface TestService {}

@Service // 默认名字为 "testServiceImpl"
public class TestServiceImpl {}

如以上代码所示,@Resource实际上会先去找名字为testService的bean,很显然这个名字的bean不存在,之后@Resource才会按类型匹配去查找TestService的实现类。
因此不给予名字的话,@Resource会去查找两次,最好是这样写

@Resource(name = "testServiceImpl")
TestService testService;
上一篇:@Resource和@Autowired 的区别


下一篇:java.io.FileNotFoundException: class path resource [springmvc.xml] cannot be opened