@Autowired和@Resource的区别
一,介绍
1.@Autowired
@Autowired
是 Spring 框架提供的一个注解,它简化了依赖注入的过程。通常情况下,当我们需要让一个类使用另一个类的功能时,我们可以在前者中声明后者的一个实例。使用 @Autowired
注解后,Spring 容器会在运行时自动将合适的实例注入到声明了该注解的成员变量或构造函数中。
使用方式
-
字段/接口注入:直接在需要注入的对象前加上
@Autowired
。@Autowired private UserRepository userRepository;
-
构造函数注入:在构造函数参数上使用
@Autowired
,这样可以确保依赖项不是可选的,并且在构造函数调用时就已经确定。@Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; }
-
方法注入:在 setter 方法或任意方法的参数上使用
@Autowired
,这允许在运行时动态改变依赖关系。@Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; }
配置选项
-
Required 属性:默认情况下,
@Autowired
要求所注入的 bean 必须存在(即 required=true)。如果找不到对应的 bean,Spring 将抛出异常。 -
如果设置
required=false
,则允许 Spring 在找不到对应 bean 时不抛出异常,而是简单地忽略这个注入点。此时,未找到的 bean 对应的注入点将会保持为 null。@Autowired(required=false) private Cat cat;
注意事项
- 当有多个相同类型的 bean 可供注入时,可以使用
@Qualifier
注解来明确指定注入哪个 bean。 - 在使用
@Autowired
时,建议对必填的依赖使用构造函数注入,这样可以清晰地表明哪些依赖是必须的,同时也方便测试。 - 使用
@Autowired
时,Spring 容器负责管理依赖关系的创建和管理,从而减轻了开发者的负担,使代码更加简洁。
2.@Resource
好的,让我们整理一下关于@Resource
注解的信息,并以更清晰的方式呈现:
@Resource
是一个来自 javax.annotation
包的标准Java注解,用于依赖注入。尽管它最初设计用于JSR-250规范,并不专属于Spring框架,但是Spring也支持使用这个注解来进行依赖注入。
使用方式
@Resource
可以应用于类、成员变量或方法上,用于标记需要自动装配的资源。默认情况下,@Resource
是按照名字来查找注入的bean (byName
),但如果找不到名字匹配的bean,则会退回到按类型注入 (byType
)。
示例代码
import javax.annotation.Resource;
public class ServiceClass {
@Resource(name = "userService")
private UserService userService;
public void performAction() {
userService.doSomething();
}
}
在这个例子中,ServiceClass
类有一个 userService
成员变量,它被 @Resource
注解修饰,并指定了名字 "userService"
。这意味着Spring容器需要提供一个名为 "userService"
的bean来注入到 userService
变量中。
属性详解
name属性
name
属性用于指定要注入的bean的名字。- 如果指定了
name
属性,Spring会尝试根据该名字来查找匹配的bean。 - 如果没有指定
name
属性,则默认使用成员变量的名字作为bean的名字进行查找。
type属性
type
属性用于指定要注入的bean的类型。- 如果指定了
type
属性,Spring会根据类型来查找匹配的bean。 - 如果没有指定
type
属性,并且也没有name
属性,则默认使用成员变量的类型进行匹配。
默认行为
如果既没有指定 name
也没有指定 type
,那么Spring会先尝试按名字(byName
)来查找匹配的bean。如果找不到匹配的名字,那么它会退回到按类型(byType
)来查找。如果按类型找到了多个匹配的bean,则会抛出异常。
综合使用
当同时指定 name
和 type
时,Spring会首先尝试按名字查找匹配的bean。如果找到了,就直接注入;如果没有找到,那么它会继续按类型来查找。如果最终还是没有找到唯一匹配的bean,或者找到了多个,那么也会抛出异常。
二,@Autowired和@Resource的区别
您的描述中有一些地方需要澄清,特别是有关@Resource
和@Autowired
的一些细节。以下是关于这两个注解之间的区别的准确说明:
-
提供者:
@Autowired
是由Spring框架提供的,用于依赖注入。@Resource
是来自javax.annotation
包的标准Java注解,虽然Spring支持该注解,但它不是Spring独有的。
-
装配方式:
@Autowired
默认按类型进行装配(byType)。如果要按名称装配,则需要结合@Qualifier
注解来指定具体的bean名称。@Resource
默认按名称进行装配(byName),如果找不到与名称匹配的bean,则退回到按类型装配(byType)。
-
依赖的bean存在性:
@Autowired
默认情况下要求被注入的bean必须存在。如果找不到匹配的bean,则会抛出异常。然而,可以通过设置@Autowired(required=false)
来忽略缺失的bean,此时如果没有找到匹配的bean,则注入点将为null。@Resource
如果找不到与名称匹配的bean,则会按类型装配。如果仍然找不到,则会抛出异常,而不是不强制要求依赖的bean存在。
-
支持的自动装配类型:
@Autowired
专门用于Spring框架内的bean装配。@Resource
可以用于任何实现了JSR-250规范的应用程序中,并且不仅仅限于Spring框架,也可以在其他容器中使用。此外,@Resource
还可以用于EJB组件中。
简结
@Autowired
更加专注于Spring框架的上下文,而@Resource
是更通用的依赖注入方式。@Autowired
默认按类型装配,而@Resource
默认按名称装配。- 两者都支持按类型装配,但
@Resource
先按名称装配,找不到才按类型装配。 - 关于依赖的bean是否存在,两者都需要存在匹配的bean,除非特别配置。
在实际应用中,选择哪个注解取决于具体的需求和上下文环境。如果是在Spring框架内进行依赖注入,并且想要利用Spring的所有特性,那么@Autowired
可能是更好的选择。而在需要更广泛兼容性的场景下,@Resource
可能更适合。