深入解析 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 应用中的依赖注入。