@Autowired和@Resource都是用于依赖注入的注解,但它们有以下主要区别:

  1. 来源不同

  • @Autowired是Spring框架提供的注解

  • @Resource是Java标准注解(JSR-250),来自javax.annotation包

  1. 装配方式不同

  • @Autowired默认按类型(byType)装配,如果找到多个相同类型的Bean,再按名称匹配

  • @Resource默认按名称(byName)装配,如果没找到则按类型(byType)装配

  1. 属性支持不同

  • @Autowired支持required属性,控制是否必须装配(默认true)

  • @Resource支持name和type属性,可以显式指定按名称或类型装配

  1. 使用方式

  • @Autowired通常用在字段、构造函数或setter方法上

  • @Resource通常用在字段或setter方法上

什么是byType和byName?

byType和byName是依赖注入的两种不同匹配方式:

  1. byName(按名称装配)

  • 根据Bean的名称进行匹配

  • Spring会查找与字段名或setter方法名完全相同的Bean

  • 例如@Resource private UserService userService; 会查找名为"userService"的Bean

  1. 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更精确。