@Autowired与@Resource区别

所属规范

@Autowired:由Spring框架自己定义的注解,仅在Spring/Spring boot生态中生效,如果项目切换到其他依赖注入,该注解会失效

@Resource:JDK1.6+原生提供的注解,属于JSR-250JavaEE规范,是通用的依赖注入标准,只要框架兼容该规范,就能使用,跨框架兼容性更好

默认注入规则

默认注入规则有:类型优先和名称优先

类型优先:Spring会先在IOC容器中查找所有类型为指定类型的Bean

名称优先:Spring会先根据注解标注的字段名/方法名,查找IOC容器中同名的Bean

java 复制代码
// 接口
public interface UserService{}
// 实现类1
@Service
public class UserServiceImpl1 implements UserService{}
// 实现类2
@Service
public class UserServiceImpl2 implements UserService{}
@Autowired:默认按类型注入

如果只有一个同类型Bean->直接注入,无需额外配置

如果有多个同类型的Bean->抛出NoUniqueBeanDefinitionException异常(类型匹配不唯一)

可以使用@Qualifier指定Bean名称

java 复制代码
// 直接注入会报错(2个UserService类型Bean)
// @Autowired
// private UserService userService;

// 配合@Qualifier指定Bean名称,精准注入
@Autowired
@Qualifier("userServiceImpl1") // 对应Bean名称:userServiceImpl1
private UserService userService;

或用@Primary标记默认优先的Bean

java 复制代码
@Service
@Primary // 标记为默认优先
public class UserServiceImpl1 implements UserService {}

// 此时直接注入不会报错,会自动注入UserServiceImpl1
@Autowired
private UserService userService;
@Resource:默认按照名称注入

找到同名Bean -> 直接注入,不管类型(只要类型兼容)

未找到同名Bean -> 降级为按类型匹配,此时行为和@Autowired一致(一个Bean注入,多个报错)

可以使用name/type属性,强制按名称/类型注入,无需其他注解

默认按字段名注入

java 复制代码
// 报错:NoUniqueBeanDefinitionException(未找到同名Bean,类型匹配多个)
@Resource
private UserService userService;

手动指定name/type

java 复制代码
// 直接指定Bean名称,精准注入userServiceImpl1
@Resource(name = "userServiceImpl1")
private UserService userService;

// 强制按类型注入,多个同类型仍会报错,行为与@Autowired一致
@Resource(type = UserService.class)
private UserService userService;
标注位置

@Autowired:可标注在字段、构造器、普通方法、方法参数上,Spring boot推荐构造器注入(能保证Bean初始化时依赖已注入,避免空指针)

java 复制代码
// 构造器注入(推荐)
@Autowired
public UserController(UserService userService) {
    this.userService = userService;
}

// 方法参数注入
public void setUserService(@Autowired UserService userService) {
    this.userService = userService;
}

@Resource:Spring中仅支持标注在字段、setter方法上,不支持构造器、普通方法、方法参数

java 复制代码
// 字段注入(支持)
@Resource
private UserService userService;

// setter方法注入(支持)
@Resource
public void setUserService(UserService userService) {
    this.userService = userService;
}

// 构造器注入(不支持,Spring中无效果)
// @Resource
// public UserController(UserService userService) {
//     this.userService = userService;
// }
相关推荐
空中海2 小时前
Spring Cloud 专家级面试题库
spring·spring cloud·面试
直奔標竿3 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD3 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring
counting money5 小时前
Spring框架基础(依赖注入-全注解形式)
java·数据库·spring
counting money5 小时前
Spring框架基础(依赖注入-半注解形式)
java·后端·spring
sing~~8 小时前
SpringCloud的了解和使用
后端·spring·spring cloud
随风,奔跑8 小时前
Spring Cloud Alibaba(六)-链路追踪SkyWalking
java·后端·spring·skywalking
云烟成雨TD8 小时前
Spring AI 1.x 系列【30】向量数据库:核心 API 和入门案例
java·人工智能·spring
敖正炀9 小时前
Spring 深度内核-核心容器与扩展机制-SpringFactoriesLoader 到 AutoConfiguration.imports:插件化演进
spring
敖正炀9 小时前
Spring 深度内核-核心容器与扩展机制-类型转换与数据绑定体系:ConversionService、PropertyEditor
spring