Spring注解的深层含义
@Autowired 和 @Resource 区别
核心区别体现在注解来源、依赖查找顺序和框架依赖性三方面。
@Autowired 是 Spring 框架的专有注解,默认按类型优先进行依赖查找;
@Resource 是 Java 标准注解(JSR-250),默认按名称优先查找,且在非 Spring 框架中也可使用
核心差异
-
注解来源。
@Autowired
:Spring 框架定义的注解,与 Spring 强绑定。1@Resource
:Java 标准注解(JSR-250 规范),与框架无关,适用于支持该规范的所有容器。
-
依赖查找顺序。
@Autowired
:先按类型(byType)查找,若存在多个同类型 Bean,再按名称(byName)匹配。@Resource
:先按名称(byName)查找,若未找到,再按类型(byType)匹配。12
-
框架依赖性。
@Autowired
:依赖 Spring IoC 容器,若切换其他 IoC 框架则无法使用。@Resource
:与框架解耦,可在任何支持 JSR-250 的环境中运行。- 功能支持与使用场景
-
方法注入支持。
@Autowired
:支持构造函数、Setter 方法、属性字段注入。@Resource
:仅支持 Setter 方法、属性字段注入(不支持构造函数注入)。3
-
空值容忍度。
@Autowired
:默认要求依赖必须存在,可通过required=false
允许空值。@Resource
:无类似参数,依赖不存在时直接报错。
-
IDE 提示差异。
使用@Autowired
时,IDEA 可能提示Field injection is not recommended
警告,因其与 Spring 强绑定;@Resource
无此提示。
实践建议
场景 | 推荐注解 | 理由 |
---|---|---|
Spring 单一类型注入 | 均可 | 两者在单实现类场景下行为一致 |
多实现类需按名称注入 | @Resource | 直接通过 name 属性指定 Bean 名称更直观2 |
跨框架兼容性要求 | @Resource | 避免与 Spring 强绑定 |