深入解析 Spring Cloud 中的 @Resource 和 @Autowired 注解的区别,以及它们在依赖注入中的使用场景和应用。
chou403
/ Spring
/ c:
/ u:
/ 4 min read
spring cloud resource 和 Autowired 什么区别
在 Spring 框架中,@Resource
和 @Autowired
是用于依赖注入的两种注解,但它们有一些重要的区别。理解这些区别有助于选择适合你的应用场景的注解。
@Autowired
@Autowired
是 Spring 框架提供的注解,用于自动装配依赖。
特点
- 按类型装配: 默认情况下,
@Autowired
按照类型(by type)进行装配。如果有多个相同类型的 bean,Spring 会根据其他因素(如@Primary
或@Qualifier
)进行装配。 - Spring 特有:
@Autowired
是 Spring 框架特有的注解。 - 可用于构造函数,字段和方法: 可以使用在构造函数,字段,Setter 方法和任意方法上。
- 可选属性: 可以设置
required
属性来指示是否必须注入(默认为true
)。
示例
字段注入:
@Autowired
private MyService myService;
构造函数注入:
@Autowired
public MyController(MyService myService) {
this.myService = myService;
}
Setter 方法注入:
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
@Resource
@Resource
是 Java 标准注解(JSR-250),Spring 对其进行了支持。
@Resource特点
- 按名称装配: 默认情况下,
@Resource
按照名称(by name)进行装配。如果找不到与名称匹配的 bean,Spring 会回退到按类型装配。 - Java 标准:
@Resource
是 Java 标准的一部分,因此在不同的依赖注入框架中也可以使用。 - 可用于字段和 Setter 方法: 可以使用在字段和 Setter 方法上。
@Resource示例
字段注入:
@Resource
private MyService myService;
Setter 方法注入:
@Resource
public void setMyService(MyService myService) {
this.myService = myService;
}
关键区别
-
装配方式:
@Autowired
: 默认按类型装配。@Resource
: 默认按名称装配。
-
注解来源:
@Autowired
: 属于 Spring 框架。@Resource
: 属于 Java 标准(JSR-250)。
-
灵活性:
@Autowired
: 可以在构造函数,字段和方法上使用,并且支持@Qualifier
注解来进一步指定需要注入的 bean。@Resource
: 主要用于字段和 Setter 方法注入,可以通过name
属性明确指定要注入的 bean。
-
依赖注入容器的行为:
@Autowired
: 如果无法满足依赖注入,可以通过设置required
属性为false
来避免异常。@Resource
: 如果无法满足依赖注入,默认会抛出异常。
何时使用
- 使用
@Autowired
: 当你需要按类型注入并希望使用 Spring 特有的功能和灵活性时。 - 使用
@Resource
: 当你需要按名称注入,或者希望使用与框架无关的标准注解时。
组合使用
有时,可能需要组合使用这两个注解。例如,当你需要按名称装配并且希望利用 Spring 提供的额外功能时,可以结合使用 @Autowired
和 @Qualifier
。
@Autowired
@Qualifier("specificBeanName")
private MyService myService;
通过了解和区分 @Autowired
和 @Resource
的使用场景,你可以更灵活地管理 Spring 应用中的依赖注入。