@Autowired
和 @Resource
都是 Java 中用于依赖注入(Dependency Injection)的注解,但它们有一些区别:
-
来源:
-
@Autowired
是 Spring 框架特有的注解,它通过类型(by type)进行自动装配。当 Spring 容器发现一个需要依赖注入的属性(或构造方法、方法参数等),它会尝试在容器中查找匹配的 bean,并将其注入进来。 -
@Resource
是 Java EE 的标准注解,被包含在javax.annotation
包中,可以在任何 Java EE 或 Spring 应用中使用。它是基于名称(by name)进行注入的,也可以指定通过名称查找注入的 bean。
-
-
注入方式:
-
@Autowired
默认按照类型进行注入。如果存在多个类型匹配的 bean,可以结合@Qualifier
注解或者使用@Primary
注解来指定首选的 bean。 -
@Resource
默认按照名称进行注入,可以通过name
属性指定要注入的 bean 名称。
-
-
可选性:
-
@Autowired
是 Spring 框架的一部分,更加强大且灵活,支持 by type、by name、by qualifier 等多种注入方式,并且支持@Primary
和@Qualifier
来解决自动装配的歧义性。 -
@Resource
是 Java EE 的标准,也可以在 Spring 中使用,但功能相对较少。它只支持 by name 方式的注入,并且不支持@Primary
和@Qualifier
。
-
-
适用范围:
-
@Autowired
是 Spring 框架的核心注解,用于处理 Spring 管理的 bean 的依赖注入。 -
@Resource
是 Java EE 的一部分,可以在各种 Java EE 兼容的环境中使用,但在 Spring 中,一般推荐使用@Autowired
或@Inject
(JSR-330 标准)来完成依赖注入。
-
总结来说,主要的区别在于注入方式和框架依赖。在使用 Spring 框架时,通常首选使用 @Autowired
进行依赖注入,因为它更灵活,并且能够支持更多的自动装配方式。而 @Resource
则是一个通用的 Java EE 标准注解,用于简单的依赖注入场景。