在Spring框架中,@Resource 和 @Autowired 是两种常用的依赖注入注解,用于将Bean注入到另一个Bean中。尽管它们的目标相似,都用于实现依赖注入,但它们之间有一些关键的区别。以下是它们的主要区别和使用方式:
1、 定义和来源
@Autowired:
来源:是Spring框架提供的注解,属于Spring的特有功能。
包名:org.springframework.beans.factory.annotation.Autowired
作用:通过类型(by type)自动注入Bean,是Spring中用于自动装配的注解。
@Resource:
来源:是来自于J2EE(Java EE)的标准注解,遵循JSR-250规范,不仅限于Spring框架使用。
包名:javax.annotation.Resource
作用:既可以通过名称(by name)注入,也可以通过类型(by type)注入。如果同时指定了名称和类型,优先使用名称。
2、 注入方式
@Autowired:
- 默认情况下是通过类型(by type)注入的。如果有多个相同类型的Bean,可以结合 @Qualifier
- 注解来指定要注入的Bean名称。 不需要设置属性名称即可进行依赖注入。 可以用在构造函数、setter方法、或成员变量上。
- 支持required 属性(默认是 true),用来表示是否必须注入,如果找不到依赖会抛出异常。可以设置 required=false 以避免注入失败。
@Autowired
private MyService myService;
@Autowired(required = false)
private MyOptionalService myOptionalService;
@Resource:
默认是通过名称(by name)注入的,依赖注入的属性名会被作为Bean的名称。如果找不到与名称匹配的Bean,再尝试按类型(by type)注入。
可以通过 name 属性指定明确的Bean名称,通过 type 属性指定类型。
与Spring的耦合较低,因为是标准的J2EE注解,具有更广泛的适用性。
@Resource
private MyService myService;
@Resource(name = "mySpecificService")
private MyService myServiceByName;
3、默认行为
@Autowired:默认情况下是必须要找到合适的Bean注入,否则会抛出异常(除非设置 required=false)。
@Resource:不会有 required 属性,它默认情况下必须要找到对应的Bean,否则会抛出异常。
举个例子:
//PostFavourMapper 不加注解
//@Mapper
public interface PostFavourMapper extends BaseMapper<PostFavour> {
}
4、 应用场景
@Autowired:更倾向于Spring应用,充分利用Spring的功能特性。如果你使用Spring框架开发项目,@Autowired 是更标准的选择。
@Resource:如果你的项目需要遵循Java EE标准或需要在不依赖Spring框架的情况下运行,@Resource 是更合适的选择。