Autowired和Resource关键字的区别?
1 个回答
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。阿银### 共同点 - **作用**:都用于 Spring Bean 的依赖注入。 - **位置**:可以写在字段和 setter 方法上。如果写在字段上,不需要再写 setter 方法。 ### 不同点 #### 1. 来源 - **`@Autowired`**:由 Spring 提供,位于 `org.springframework.beans.factory.annotation.Autowired` 包下。 - **`@Resource`**:由 J2EE 提供,位于 `javax.annotation.Resource` 包下。虽然是 Java 标准注解,但 Spring 也支持它用于依赖注入。 #### 2. 注入方式 - **`@Autowired`**:默认是按类型(byType)注入。具体逻辑如下: - Spring 首先根据类型查找 Bean(byType)。 - 如果找到多个同类型的 Bean,Spring 会尝试按名称(byName)匹配字段名称。 - 如果仍无法确定要注入的 Bean,可以结合 `@Qualifier` 注解明确指定 Bean 名称,或者抛出异常。 - 如果允许注入值为 `null`,可以设置 `required = false`。 > **示例**: ```java @Autowired(required = false) private MyBean myBean; // 可为 null 的类型注入 @Autowired @Qualifier("specificBean") private MyBean specificBean; // 结合 @Qualifier 明确指定 Bean 名称 ``` - **`@Resource`**:默认是按名称(byName)注入,注入逻辑与 `@Autowired` 恰好相反: - `@Resource` 首先根据名称(byName)查找 Bean。 - 如果找不到匹配的 Bean,才会按类型(byType)进行查找。 - 可以使用 `name` 和 `type` 属性显式指定注入方式。例如,指定 `name` 则按名称注入,指定 `type` 则按类型注入。 > **示例**: ```java @Resource(name = "myBean") // 指定按名称注入 private MyBean myBean; @Resource(type = MyBean.class) // 指定按类型注入 private MyBean typeBean; ``` #### 3. 注解属性 - **`@Autowired`**:仅有 `required` 属性,默认为 `true`,表示注入的 Bean 必须存在。如果设置 `required = false`,则允许注入值为 `null`,常用于可选依赖。 - **`@Resource`**:有 `name` 和 `type` 属性。 - `name`:用于指定要注入的 Bean 名称。 - `type`:用于指定要注入的 Bean 类型。 ### 使用示例 **`@Autowired` 示例**: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class MyService { @Autowired private MyBean myBean; // 默认按类型注入 @Autowired(required = false) private OptionalBean optionalBean; // 可为 null 的类型注入 @Autowired @Qualifier("specificBean") private MyBean specificBean; // 按名称注入 } ``` **`@Resource` 示例**: ```java import javax.annotation.Resource; import org.springframework.stereotype.Component; @Component public class MyService { @Resource private MyBean myBean; // 默认按名称注入 @Resource(name = "specificBean") private MyBean specificBean; // 按指定名称注入 @Resource(type = MyBean.class) private MyBean typeBean; // 按类型注入 } ``` ### `@Resource` 的装配顺序 - 如果同时指定 `name` 和 `type` 属性,Spring 会在容器中查找与名称和类型都匹配的唯一 Bean,找不到则抛出异常。 - 如果仅指定 `name`,则按名称查找 Bean,找不到则抛出异常。 - 如果仅指定 `type`,则按类型查找唯一 Bean,找不到或找到多个 Bean 都会抛出异常。 - 如果未指定 `name` 和 `type`,则默认按名称查找。如果没有名称匹配,再按类型查找。 ### 总结 | 特性 | `@Autowired` | `@Resource` | |------------------|-------------------------------------------------|------------------------------------------------| | 来源 | 由 Spring 提供 | 由 J2EE 提供 | | 默认注入方式 | 按类型注入(byType) | 按名称注入(byName) | | 支持按名称注入 | 使用 `@Qualifier` 指定 Bean 名称 | 使用 `name` 属性指定名称 | | 支持按类型注入 | 默认支持 | 使用 `type` 属性指定类型 | | 是否必须依赖对象 | 默认必须,`required = false` 可允许为 `null` | 默认必须,找不到会抛出异常 | | 适用场景 | 适合所有 Spring 应用场景 | 适合兼容 J2EE 标准的项目场景 | ### 总体来说 - **`@Autowired`**:Spring 提供的注入方式,默认按类型注入,可选按名称注入。适用于大多数 Spring 应用场景。 - **`@Resource`**:Java 标准的注解,默认按名称注入,支持通过 `name` 或 `type` 属性指定注入方式。适合需要兼容 Java EE 标准的项目场景。 通过合理选择 `@Autowired` 和 `@Resource`,可以实现更灵活的依赖注入,提升代码的可维护性和可读性。编辑于 2024-08-01 07:44 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

