@Autowired和@Resource都是用于依赖注入的注解,但它们有以下主要区别:
来源不同:
@Autowired是Spring框架提供的注解
@Resource是Java标准注解(JSR-250),来自javax.annotation包
装配方式不同:
@Autowired默认按类型(byType)装配,如果找到多个相同类型的Bean,再按名称匹配
@Resource默认按名称(byName)装配,如果没找到则按类型(byType)装配
属性支持不同:
@Autowired支持required属性,控制是否必须装配(默认true)
@Resource支持name和type属性,可以显式指定按名称或类型装配
使用方式:
@Autowired通常用在字段、构造函数或setter方法上
@Resource通常用在字段或setter方法上
什么是byType和byName?
byType和byName是依赖注入的两种不同匹配方式:
byName(按名称装配):
根据Bean的名称进行匹配
Spring会查找与字段名或setter方法名完全相同的Bean
例如
@Resource private UserService userService;会查找名为"userService"的Bean
byType(按类型装配):
根据Bean的类型进行匹配
Spring会查找与字段类型相同的Bean
例如
@Autowired private UserService userService;会查找类型为UserService的Bean
简单例子:
// 假设有两个UserService实现
@Service("userServiceImplA")
public class UserServiceImplA implements UserService {...}
@Service("userServiceImplB")
public class UserServiceImplB implements UserService {...}
// byName装配 - 查找名为"userService"的Bean
@Resource(name="userServiceImplA")
private UserService userService;
// byType装配 - 查找UserService类型的Bean
@Autowired
private UserService userService; // 这里会有歧义,因为有两个UserService实现当存在多个实现时,byType可能产生歧义,而byName更精确。