目录
@Autowired
和 @Resource
都是 Java 中用于依赖注入(Dependency Injection, DI)的注解,它们的主要区别在于来源、处理方式和支持的特性上。
1. 来源
-
@Autowired
:是 Spring 框架特有的注解,用于实现依赖注入。它基于类型(byType)进行自动装配,如果需要,也可以基于名称(byName)进行装配。 -
@Resource
:来源于 JSR-250(Java EE 5 引入的规范),是 Java 标准的一部分,不仅限于 Spring 框架,但 Spring 提供了对它的支持。@Resource
默认按照名称(byName)进行装配,如果找不到匹配的 bean 名称,则回退到按类型(byType)装配。
2. 处理方式
-
@Autowired
:
-
默认情况下,
@Autowired
要求依赖对象必须存在,如果 Spring 容器中不存在对应类型的 bean,则会抛出异常。 -
可以通过设置
required
属性为false
来改变这一行为,使得如果找不到匹配的 bean,则不会抛出异常,依赖对象会被设置为null
。 -
支持构造函数、字段、setter 方法等多种注入方式。
-
-
@Resource
:
-
@Resource
允许通过name
属性指定要注入的 bean 的名称。 -
如果不指定
name
属性,则默认按照名称(bean 的名称)进行装配,如果找不到匹配的名称,则回退到按类型装配。 -
@Resource
也可以用于字段、setter 方法等注入方式。
-
3. 支持的特性
-
@Autowired
:
-
支持
@Qualifier
注解来指定注入的 bean 名称,实现更精确的依赖注入。 -
可以与
@Primary
注解结合使用,标记某个 bean 为首选的 bean,当存在多个相同类型的 bean 时,优先注入这个被标记为@Primary
的 bean。
-
-
@Resource
:
-
提供了更广泛的兼容性,因为它不仅限于 Spring 框架。
-
可以通过
name
和type
属性来灵活指定依赖注入的方式。
-
总结
-
如果你正在使用 Spring 框架,并且希望利用 Spring 提供的更多特性(如
@Primary
、@Qualifier
),那么@Autowired
是一个更好的选择。 -
如果你希望你的代码更加标准化,不依赖于 Spring 框架的特定实现,或者你需要通过名称来精确控制依赖注入,那么
@Resource
可能更适合你的需求。